Я запутался во времени во время java. Я так долго работал в предположении, что если временная метка указана как время zulu, java позаботится о смещении относительно местного времени.Путаница с Java Разбор по времени UTC
Для иллюстрации. Я в настоящее время в BST, который имеет смещение UTC +1. Имея это в виду, я бы ожидать, что это Зулу время:
2016-09-12T13:15:17.309Z
быть
2016-09-12T14:15:17.309
LocalDateTime после разбора его. Это связано с тем, что мое системное время по умолчанию установлено в BST, и указанная выше временная метка (время zulu) указывает, что это время 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
Что является правильным.
Поэтому вопрос (ы):
- Не следует ява времени распознать UTC метку времени и разобрать его на правильные системы по умолчанию?
- Как использовать подход
LocalDateTime#parse
, чтобы получить правильный результат? - Должен ли я использовать
Instant
для всего и отменить разбор?
Вопрос заключается в том, что время ява модули jersey/jackson
«s анализировать временные метки с использованием формата ISO и регулярные LocalDateTime#parse
методы. Я понял, что мои времена не прошли, так как они обрабатываются как LocalTime
, в то время как на самом деле они находятся в Зулу.
Ваш пример выглядит так, как если бы это было мгновенное обсуждение моего примера 3. Вы правы, я неправильно понял, что означает LocalDateTime. ughh .. timezones :) Спасибо – pandaadb
Ах, поэтому ZonedDateTime распознает часовой пояс как «Z», который он интерпретирует как UTC автоматически (просто то, что я хочу) - это правильно? – pandaadb
@pandaadb Да, это, вероятно, еще один способ для написания этого. –