LocalDateTime в зоне не отображает час дня зоны - PullRequest
0 голосов
/ 27 мая 2018

У меня есть дата и время в 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 ]

0 голосов
/ 27 мая 2018

У меня сложилось впечатление, что вы путаете и приравниваете "нет информации о часовом поясе" к "часовому поясу 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")));
0 голосов
/ 27 мая 2018

Вы используете 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]
...