Меня смущает обработка времени во времени Java. Я так долго работал в предположении, что если временная метка указана как время зулу, java позаботится о смещении относительно местного времени.
Проиллюстрировать. В настоящее время я нахожусь в BST со смещением UTC +1. Имея это в виду, я бы ожидал, что это время зулу:
2016-09-12T13:15:17.309Z
to be
2016-09-12T14:15:17.309
LocalDateTime после его разбора. Это связано с тем, что мое системное время по умолчанию установлено на BST, а указанная выше временная метка (время зулу) указывает, что это время UTC.
Однако вместо этого рассмотрим этот образец:
String ts = "2016-09-12T13:15:17.309Z";
LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
Это напечатает:
2016-09-12T13:15:17.309
Таким образом, отметка времени, проанализированная как LocalDateTime, не распознается как время UTC и вместо этого обрабатывается непосредственно как местное время. Поэтому я подумал, может быть, мне нужно разобрать его как ZonedDateTime и преобразовать в LocalDateTime специально для того, чтобы получить правильное местное время. С этим тестом:
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());
Я получаю результаты:
2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
Тот же вывод для обеих дат.
Единственный способ правильно разобрать это, что я смог найти, это:
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);
Это печатает:
2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
Что правильно.
Итак, вопрос(ы):
- Разве время Java не должно распознавать временную метку UTC и анализировать ее по правильному системному умолчанию?
- Как я могу использовать подход
LocalDateTime#parse
для получения правильного результата? - Должен ли я теперь использовать
Instant
для всего и отказаться от синтаксического анализа?
Проблема в том, что java-модули времени jersey/jackson
анализируют метки времени, используя формат ISO и обычные методы LocalDateTime#parse
. Я понял, что мое время не изменилось, так как к ним относятся как к LocalTime
, хотя на самом деле они находятся в зулусском времени.