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]
Другие вопросы по тегам