LocalDateTime в зоне не отображает час дня зоны
У меня есть дата и время в UTC в LocalDateTime lastUpdated
, Я хотел бы отображать время и дату для данной зоны, но независимо от того, какую зону я получаю в одно и то же время дня. Для следующего кода:
System.out.println(lastUpdated);
System.out.println(lastUpdated.atZone(ZoneId.of("Europe/Paris")));
System.out.println(lastUpdated.atZone(ZoneId.of("America/Los_Angeles")));
Я получаю:
2018-05-26T21:33:46
2018-05-26T21:33:46+02:00[Europe/Paris]
2018-05-26T21:33:46-07:00[America/Los_Angeles]
но то, что я хотел бы получить, это:
2018-05-26T21:33:46
2018-05-26T**23**:33:46+02:00[Europe/Paris]
2018-05-26T**14**:33:46-07:00[America/Los_Angeles]
Информация о зоне для меня необязательна. Мне просто нужно время в зоне. Есть ли способ добиться этого?
2 ответа
У меня сложилось впечатление, что вы путаете и приравниваете "отсутствие информации о часовом поясе" к "часовому поясу UTC... Потому что, когда я не говорю, какой часовой пояс это UTC... Верно?"
Неправильно. Когда вы не говорите, что такое часовой пояс, у вас нет конкретной информации о часовом поясе.
Таким образом, ваш 2018-05-26T21:33:46 - это не дата и время, UTC, это понятие даты и времени на эту дату, не зная, что существует понятие часовых поясов. Это то, что вы получаете, когда идете и спрашиваете кого-то, какая сегодня дата и сколько времени. Нет, они не подумают, что вы также можете подумать, что вы находитесь в часовом поясе. Парень просто не будет думать, что существует такая вещь, как часовые пояса, и все же он будет быть в состоянии сказать, какой это день и время.
Итак, чтобы преобразовать дату и время в UTC, в дату и время в других часовых поясах, вы делаете это:
ZonedDateTime time = lastUpdated.atZone(ZoneId.of("UTC"));
System.out.println(time);
System.out.println(time.withZoneSameInstant(ZoneId.of("Europe/Paris")));
System.out.println(time.withZoneSameInstant(ZoneId.of("America/Los_Angeles")));
Вы используете LocalDateTime
, который является указанием даты и времени без часового пояса, который вы использовали бы при обсуждении даты и времени с людьми в вашем собственном часовом поясе. atZone
возвращает ZonedDateTime
этой даты в то время, как если бы вы говорили об этом в этом часовом поясе.
Таким образом, чтобы получить разное время вам нужно преобразовать ZonedDateTime
для Instant
, который является моментом времени, идентифицированным для всей планеты. Тот Instant
затем может быть преобразован в ZonedDateTime
снова.
LocalDateTime lastUpdated = LocalDateTime.now();
ZonedDateTime zonedDateTime = lastUpdated.atZone(ZoneId.of("Europe/Paris"));
System.out.println(zonedDateTime);
ZonedDateTime other = ZonedDateTime.ofInstant(zonedDateTime.toInstant(), ZoneId.of("America/Los_Angeles"));
System.out.println(other);
Выход:
2018-05-27T21:53:53.754+02:00[Europe/Paris]
2018-05-27T12:53:53.754-07:00[America/Los_Angeles]