Як перетворити LocalDate в миттєвий?


106

Я працюю з новим API API DateTime Java 8.

Як перетворити LocalDate в миттєвий? Я отримую виняток із

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

і я не розумію, чому.


Тому LocalDateщо не включає час.
OrangeDog

Відповіді:


98

InstantКлас являє собою миттєву точку на тимчасової лінії. Для перетворення в та з нього LocalDateпотрібен часовий пояс. На відміну від деяких інших бібліотек дат і часу, JSR-310 не вибере часовий пояс для вас автоматично, тому ви повинні надати його.

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

У цьому прикладі використовується часовий пояс за замовчуванням JVM - ZoneId.systemDefault()- для здійснення перетворення. Дивіться тут, щоб отримати більш довгу відповідь на пов'язане питання.


Оновлення: прийнята відповідь використовує те, LocalDateTime::toInstant(ZoneOffset)що лише приймає ZoneOffset. У цій відповіді використовується те, LocalDate::atStartOfDay(ZoneId)що приймає будь-яке ZoneId. Ця відповідь, як правило, є більш корисною (і, мабуть, повинна бути прийнятою).

PS. Я був головним автором API


1
Я думаю, що це корисніше, ніж прийнята відповідь, оскільки ZoneId (часовий пояс) є параметром, а не ZoneOffset (години зміщені від UTC, які можуть змінюватися для часового поясу влітку / взимку).
вюрг

1
У тесті одиниці, яку я пишу, у мене є LocalDate, який перетворюється на com.google.protobuf.Timestamp, а потім відображається назад до LocalDate через миттєвий пошук, обидва способи. Використовуючи підхід, який приймає відповідь, я отримую очікуваний LocalDate у відповідь, але використовуючи такий підхід, я повертаю "вчора" замість "сьогодні". Мій часовий пояс GMT + 1
Nadrendion

127

Щоб перетворити його на мить, вам потрібно мати екземпляр LocalDateTime, наприклад:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

Дуже дякую. Тепер я розумію, що мені потрібно вказати часовий пояс, щоб отримати Миттєвий пошук.
user1643352
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.