Как в Java 8 преобразовать Timestamp
(в java.sql
) в LocalDate
(в java.time
)?
Как преобразовать java.sql.timestamp в LocalDate (java8) java.time?
Ответы (3)
Ты можешь сделать:
timeStamp.toLocalDateTime().toLocalDate();
Обратите внимание, что
timestamp.toLocalDateTime()
для преобразования будет использоваться часовой поясClock.systemDefaultZone()
. Это может быть или не быть тем, что вам нужно.
timestamp.toLocalDateTime()
будет использовать часовой пояс systemDefault для преобразования. Это может быть или не быть тем, что вы хотите.
- person jacobhyphenated; 24.04.2014
LocalDateTime
всегда использует системный часовой пояс по умолчанию. Вот что означает Local в своем названии.
- person M. Prokhorov; 26.08.2019
now()
теперь находится в зоне по умолчанию, следовательно, в локальной части. Честно говоря, было бы лучше просто назвать его DateTime
, а не now()
.
- person M. Prokhorov; 28.08.2019
Принятый ответ не идеален, поэтому я решил добавить свои 2 цента.
timeStamp.toLocalDateTime().toLocalDate();
в целом это плохое решение, я даже не знаю, почему они добавили этот метод в JDK, поскольку он делает вещи действительно запутанными, выполняя неявное преобразование с использованием системного часового пояса. Обычно при использовании только классов даты java8 программист вынужден указывать часовой пояс, что хорошо.
Хорошее решение
timestamp.toInstant().atZone(zoneId).toLocalDate()
Где zoneId – это часовой пояс, который вы хотите использовать. Обычно это либо ZoneId.systemDefault(), если вы хотите использовать системный часовой пояс, либо какой-либо жестко заданный часовой пояс, например ZoneOffset. Всемирное координированное время
Общий подход должен быть
- Освободитесь от новых классов даты java8, используя класс, который напрямую связан, например. в нашем случае java.time.Instant напрямую связан с java.sql.Timestamp, т. е. между ними не требуется никаких преобразований часовых поясов.
- Используйте хорошо разработанные методы в этом классе java8, чтобы поступать правильно. В нашем случае atZone(zoneId) явно указал, что мы выполняем преобразование и используем для этого определенный часовой пояс.
Я немного расширю ответ @assylias, чтобы учесть часовой пояс. Есть как минимум два способа получить LocalDateTime для определенного часового пояса.
Вы можете использовать часовой пояс setDefault для всего приложения. Его следует вызывать перед преобразованием временной метки -> java.time:
public static void main(String... args) {
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(utcTimeZone);
...
timestamp.toLocalDateTime().toLocalDate();
}
Или вы можете использовать цепочку toInstant.atZone:
timestamp.toInstant()
.atZone(ZoneId.of("UTC"))
.toLocalDate();