Bonjour à tous,
Débat commencé ici, j'ai des choses à clarifier et appliquer ça à la stack Java complète, pas seulement la DB.
La stack :
- JodaTime pour les dates ;
- Hibernate pour l'ORM ;
- Jadira pour le support du mapping de JodaTime ;
- PostgreSQL pour la DB.
Je stocke et affiche des événements relatifs à mes utilisateurs, genre "s'est gratté la tête le lundi 12 janvier à 16h46". La date est rentrée par l'utilisateur, et peut être modifié. Si je décide que je me suis gratté la tête ce jour là à cette heure, c'est donc sur ma timezone. Quel que soit mon format de stockage, je devrais être en mesure de reservir à l’utilisateur l'heure exacte entrée.
Sur BlaBla@SQL, le conseil est de stocker la date en UTC, et éventuellement la TZ pour refiler ça à l'utilisateur ensuite (c'est mon cas).
Le mapper 'org.jadira.usertype.dateandtime.joda.PersistentDateTimeWithZone' me permet ça, avec le datetime stocké d'une part, et la TZ dans une autre colonne. Si j'ai tout suivi, la datetime devrait être en UTC ('08:40' s'il est '10:40' à Paris) ?
Évidemment, ça ne fonctionne pas comme je le souhaite, donc questions
Lorsque l'utilisateur saisie ses données, je récupère sa TZ dans le paramètre de datetime. Je créé le DateTime Joda en fonction, DateTime qui se balade jusqu'à la couche Hibernate tel quel.
Si je le laisse comme ça, il est stocké (pour une entrée aujourd'hui à 10h40) comme '2013-06-07 10:40:00' et 'Europe/Paris{+02:00}'. Si j'ai bien suivi, le datetime devrait être UTC, et donc '2013-06-07 10:40:00' ?
C'est quoi le moyen le plus propre, je sauvegarde la TZ dans un champ à part, puis converti en UTC ? Si c'est le cas, je dois me débrouiller avec 'org.jadira.usertype.dateandtime.joda.PersistentDateTime' plutôt que la version gérant la zone.
Une autre méthode, un truc que j'ai raté ?
De même, je lis beaucoup qu'une bonne pratique consiste à n'utiliser que l'UTC en interne à la JVM, pour ce qui est calculs et intervalles. Vous êtes OK avec ça ?
La seule méthode que je connaisse pour ça (portable d'une lib à l'autre), c'est -Duser.timezone=UTC, sauf que ça vient écraser la TZ fournie par l'utilisateur, et donc je suis encore fucké.
Merci d'avance