Рубрики
Без рубрики

Java 8 – Преобразование даты в локальную дату и локальное время

– Java 8 – Преобразование даты в локальную дату и локальное время

Автор оригинала: 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. Данные не хранят никакой информации о часовом поясе, но если вы распечатаете ее, часовой пояс системы по умолчанию будет отображаться вместе.

Рекомендации

Оригинал: “https://mkyong.com/java8/java-8-convert-date-to-localdate-and-localdatetime/”