Java 8 – Создание Instant из LocalDateTime с учетом часового пояса
Описание проблемы:
У меня есть дата, хранящаяся в базе данных в формате строки ddMMyyyy и hh:mm вместе с информацией о временной зоне. Я хочу создать объект типа Instant
на основе этой информации, но не знаю, как это сделать.
Нужно реализовать что-то похожее на следующий код:
LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
Instant instant = dateTime.toInstant(TimeZone.getTimeZone("ECT"));
Кто-нибудь может подсказать, как правильно преобразовать строку с датой и временем в объект Instant
, принимая во внимание временную зону? Заранее спасибо!
2 ответ(ов)
Вы можете сначала создать объект ZonedDateTime
с нужной временной зоной, а затем вызвать метод toInstant
:
LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant();
System.out.println(instant); // 2017-06-15T11:39:00Z
Я также перешел на использование полного названия временной зоны (согласно совету Basil), так как это менее двусмысленно.
Забудьте про старый класс TimeZone. Используйте ZoneId
, так как он правильно безопасен для потоков, и вы можете просто использовать final static
поле для хранения временной зоны.
Вот пример:
LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, ZoneId.of("ECT"));
Instant instant = zonedDateTime.toInstant();
Таким образом, вы получите корректное представление временной метки, безопасное для многопоточности.
Сортировка ArrayList пользовательских объектов по свойству
Java 8: Преобразование List<V> в Map<K, V>
Java 8: Как использовать лямбда-функцию, которая выбрасывает исключение?
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?
Java Лямбда-выражения [закрыто]