Автор оригинала: mkyong.
Вот код для преобразования java.util. Дата
до java.время. Локальная дата
.
Date date = new Date(); LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); // different way of create instant object LocalDate localDate = Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
Преобразовать java.util. Дата
до java.время. Локальное время
.
Date date = new Date(); LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
Преобразовать java.util. Дата
до java.время. Дата в зоне
.
Date date = new Date(); ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());
Для java.sql. Дата
, мы можем преобразовать ее напрямую.
java.sql.Date sqlDate = java.sql.Date.valueOf("2020-02-05"); LocalDate localDate2 = sqlDate.toLocalDate();
1. Дата -> java.время. Локальная дата
Файл java.util. Дата
не имеет понятия о часовом поясе и представляет только количество секунд, прошедших с момента времени эпохи Unix – 1970-01-01T00:00:00Z (полночь в начале 1 января 1970 года по Гринвичу/UTC)
Примечание Новая Java 8 java.время. Instant
является классом, эквивалентным классическому java.util. Дата
Идея преобразования данных состоит в том, чтобы преобразовать их в мгновение с часовым поясом.
Date -> Instant + System default time zone = LocalDate Date -> Instant + System default time zone = LocalDateTime Date -> Instant + System default time zone = ZonedDateTime
package com.mkyong.java8; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; public class DateToJavaTime { public static void main(String[] args) { //Asia/Kuala_Lumpur +8 ZoneId defaultZoneId = ZoneId.systemDefault(); System.out.println("System Default TimeZone : " + defaultZoneId); //toString() append +8 automatically. Date date = new Date(); System.out.println("date : " + date); //1. Convert Date -> Instant Instant instant = date.toInstant(); System.out.println("instant : " + instant); //Zone : UTC+0 //2. Instant + system default time zone + toLocalDate() = LocalDate LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate(); System.out.println("localDate : " + localDate); //3. Instant + system default time zone + toLocalDateTime() = LocalDateTime LocalDateTime localDateTime = instant.atZone(defaultZoneId).toLocalDateTime(); System.out.println("localDateTime : " + localDateTime); //4. Instant + system default time zone = ZonedDateTime ZonedDateTime zonedDateTime = instant.atZone(defaultZoneId); System.out.println("zonedDateTime : " + zonedDateTime); } }
Выход
System Default TimeZone : Asia/Kuala_Lumpur date : Fri Aug 19 21:46:31 MYT 2016 instant : 2016-08-19T13:46:31.981Z localDate : 2016-08-19 localDateTime : 2016-08-19T21:46:31.981 zonedDateTime : 2016-08-19T21:46:31.981+08:00[Asia/Kuala_Lumpur]
2. java.время. Локальная дата -> Дата
В этом примере показано, как преобразовать Локальную дату
, Локальное время
и ZonedDateTime
вернуться к классическому java.util. Дата
.
package com.mkyong.java8; import java.time.*; import java.util.Date; public class JavaTimeToDate { public static void main(String[] args) { //Asia/Kuala_Lumpur +8 ZoneId defaultZoneId = ZoneId.systemDefault(); System.out.println("System Default TimeZone : " + defaultZoneId); LocalDate localDate = LocalDate.of(2016, 8, 19); Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant()); System.out.println("\n1. LocalDate -> Date"); System.out.println("localDate : " + localDate); System.out.println("date : " + date); LocalDateTime localDateTime = LocalDateTime.of(2016,8,19,21,46,31); Date date2 = Date.from(localDateTime.atZone(defaultZoneId).toInstant()); System.out.println("\n2. LocalDateTime -> Date"); System.out.println("localDateTime : " + localDateTime); System.out.println("date2 : " + date2); ZonedDateTime zonedDateTime = localDateTime.atZone(defaultZoneId); Date date3 = Date.from(zonedDateTime.toInstant()); System.out.println("\n3. ZonedDateTime -> Date"); System.out.println("zonedDateTime : " + zonedDateTime); System.out.println("date3 : " + date3); } }
Выход
System Default TimeZone : Asia/Kuala_Lumpur 1. LocalDate -> Date localDate : 2016-08-19 date : Fri Aug 19 00:00:00 MYT 2016 2. LocalDateTime -> Date localDateTime : 2016-08-19T21:46:31 date2 : Fri Aug 19 21:46:31 MYT 2016 3. ZonedDateTime -> Date zonedDateTime : 2016-08-19T21:46:31+08:00[Asia/Kuala_Lumpur] date3 : Fri Aug 19 21:46:31 MYT 2016
Часто задаваемые вопросы
Вопрос: Если Дата не имеет понятия о часовом поясе, почему часовой пояс будет отображаться, если мы распечатаем объект данных? Например:
//Fri Aug 19 11:52:06 MYT 2016 System.out.println(new Date()); //MYT = my system default time zone
Ответ : Проверьте java.util. Date.toString()
исходный код, если вы распечатаете объект даты, часовой пояс системы по умолчанию будет добавлен и отображен вместе.
public String toString() { //...omitted... TimeZone zi = date.getZone(); if (zi != null) { sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz } else { sb.append("GMT"); } sb.append(' ').append(date.getYear()); // yyyy return sb.toString(); }
Примечание Такое поведение является недостатком дизайна начиная с JDK1.1; это создает много путаницы. Опять же, java.util. Данные
не хранят никакой информации о часовом поясе, но если вы распечатаете ее, часовой пояс системы по умолчанию будет отображаться вместе.
Рекомендации
- JSR 310: API даты и времени
- Википедия время Unix
- Мгновенный JavaDoc
- Дата JavaDoc
- Java – Преобразование даты и времени между часовыми поясами
Оригинал: “https://mkyong.com/java8/java-8-convert-date-to-localdate-and-localdatetime/”