Je suis confus avec la gestion du temps en java time. J'ai longtemps travaillé en supposant que si un horodatage est spécifié en tant qu'heure zulu, java se chargeait du décalage par rapport à l'heure locale.
Pour illustrer. Je suis actuellement en BST qui a un décalage de UTC +1. Avec cela en tête, je m'attendrais à cette heure zoulou :
2016-09-12T13:15:17.309Z
à être
2016-09-12T14:15:17.309
LocalDateTime après l'avoir analysé. Cela est dû au fait que mon heure système par défaut est définie sur BST et que l'horodatage ci-dessus (heure zoulou) spécifie qu'il s'agit d'une heure UTC.
Mais considérez plutôt cet échantillon :
String ts = "2016-09-12T13:15:17.309Z";
LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
Cela va s'imprimer :
2016-09-12T13:15:17.309
Ainsi, le timestamp, analysé comme un LocalDateTime, n'est pas reconnu comme une heure UTC et est traité directement comme une heure locale. J'ai donc pensé que je devais peut-être l'analyser comme un ZonedDateTime et le convertir en LocalDateTime afin d'obtenir l'heure locale correcte. Avec ce test :
String ts = "2016-09-12T13:15:17.309Z";
ZonedDateTime parse = ZonedDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
System.out.println(parse.toLocalDateTime());
Je reçois les sorties :
2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
Même résultat pour les deux dates.
La seule façon d'analyser correctement ceci que j'ai pu trouver, est :
String ts = "2016-09-12T13:15:17.309Z";
Instant instant = Instant.parse(ts); // parses UTC
LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);
System.out.println(ofInstant);
Cette empreinte :
2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
Ce qui est correct.
La ou les questions sont donc les suivantes :
- Le temps java ne devrait-il pas reconnaître un timestamp UTC et l'analyser en fonction du système correct par défaut ?
- Comment puis-je utiliser le
LocalDateTime#parse
pour obtenir un résultat correct ? - Dois-je utiliser
Instant
pour tout maintenant et abandonner l'analyse syntaxique ?
Le problème est que jersey/jackson
Les modules de temps java de l'entreprise analysent les horodatages en utilisant le format ISO et le format régulier LocalDateTime#parse
méthodes. Je me suis rendu compte que mon temps n'est pas compté puisqu'il est traité comme LocalTime
alors qu'en fait ils sont à l'heure zouloue.