Для преобразования LocalDateTime в Instant требуется ZoneOffset. Зачем?

Мне нужно конвертировать LocalDateTime возражать против нового Instant объект.

Я поняла LocalDateTime имеет toInstant метод, но он просит меня ZoneOffset,

Я не совсем понимаю, как его использовать, или что делает ZoneOffset предназначены для.

2 ответа

Решение

Вы не можете конвертировать LocalDateTime прямо к Instant потому что LocalDateTime может представлять много моментов. Он не представляет один конкретный момент времени.

Вот LocalDateTime:

23/10/2018 09:30:00

Можете ли вы выяснить, к какому моменту времени относится вышеуказанное, просто взглянув на него? Нет. Потому что это время в Великобритании отличается от того времени в Китае.

Чтобы выяснить, к какому моменту относится это время, вам также необходимо знать, на сколько часов оно смещено относительно UTC, и это то, что ZoneOffset в основном представляет.

Например, для смещения 8 часов, вы должны написать это:

localDateTime.toInstant(ZoneOffset.ofHours(8))

Или, если вы знаете, что всегда хотите смещение зоны в текущем часовом поясе для этого местного времени, вы можете заменить ZoneOffset.ofHours(8) с:

ZoneId.systemDefault().getRules().getOffset(localDateTime)

Вы должны подумать о том, какое смещение вы хотите использовать, прежде чем конвертировать его в мгновение ока.

Вы можете попробовать это:

LocalDateTime dateTime = LocalDateTime.of(2018, Month.OCTOBER, 10, 31, 56);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Rome")).toInstant();
System.out.println(instant);
Другие вопросы по тегам