如何使用新的Java 8 Date Time在旧的Date和Calendar对象之间转换?

在此示例中,我们将学习如何将旧对象java.util.Date和java.util.Calendar对象转换为Java 8中引入的新的Date Time。下面的代码片段中的第一种方法dateToNewDate()show的转换,java.util.Date而calendarToNewDate()show的转换java.util.Calendar。

该java.util.Date和java.util.Calendar提供toInstant()给对象转换为新的日期时间API类的方法java.time.Instant。旧日期转换到Java 8 LocalDate,LocalTime和LocalDateTime我们第一次可以创建的实例ZonedDateTime使用atZone()的方法Instant类。

ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

从实例ZonedDateTime类,我们可以调用toLocalDate(),toLocalTime()并且toLocalDateTime()得到的实例LocalDate,LocalTime和LocalDateTime。

为了将新的Java 8日期转换回旧的日期,java.util.Date我们可以使用Date.from()静态工厂方法,并java.time.Instant通过调用以下代码获得传递的实例。

Instant instant1 = dateTime.atZone(ZoneId.systemDefault()).toInstant();
Date now1 = Date.from(instant1);

这是可转换java.util.Date为新的Java 8 Date Time的完整代码段。

private static void dateToNewDate() {
    Date now = new Date();
    Instant instant = now.toInstant();

    ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

    LocalDate date = zonedDateTime.toLocalDate();
    LocalTime time = zonedDateTime.toLocalTime();
    LocalDateTime dateTime = zonedDateTime.toLocalDateTime();

    Instant instant1 = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date now1 = Date.from(instant1);

    System.out.println("java.util.Date          = " + now);
    System.out.println("java.time.LocalDate     = " + date);
    System.out.println("java.time.LocalTime     = " + time);
    System.out.println("java.time.LocalDateTime = " + dateTime);
    System.out.println("java.util.Date          = " + now1);
    System.out.println();
}

从转换java.util.Calendar为新的Java 8日期的步骤可以在下面的代码片段中找到。与java.util.Date该Calendar班提供toInstant()方法将日历转换为java.time.Instant对象。

使用该LocalDateTime.ofInstant()方法,我们可以LocalDateTime从即时对象创建对象。通过拥有LocalDateTime对象,我们可以通过调用and方法来获取LocalDateand的实例。LocalTimetoLocalDate()toLocalTime()

最后要转换回去,java.util.Calendar我们可以使用GregorianCalendar.from()静态工厂方法,该方法要求将的实例ZonedDateTime作为参数传递。要获取实例,ZonedDateTime我们可以调用LocalDateTime.atZone()method。您可以在下面的代码片段中查看完整的代码。

private static void calendarToNewDate() {
    Calendar now = Calendar.getInstance();

    LocalDateTime dateTime = LocalDateTime.ofInstant(now.toInstant(),
            ZoneId.systemDefault());

    LocalDate date = dateTime.toLocalDate();
    LocalTime time = dateTime.toLocalTime();

    ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.systemDefault());
    Calendar now1 = GregorianCalendar.from(zonedDateTime);

    System.out.println("java.util.Calendar      = " + now);
    System.out.println("java.time.LocalDateTime = " + dateTime);
    System.out.println("java.time.LocalDate     = " + date);
    System.out.println("java.time.LocalTime     = " + time);
    System.out.println("java.util.Calendar      = " + now1);
}

下面是运行代码片段的主要Java类。您必须将上述方法放入此类中才能运行代码段。

package org.nhooo.example.datetime;

import java.time.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class LegacyDateCalendarToNewDateExample {
    public static void main(String[] args) {
        dateToNewDate();
        calendarToNewDate();
    }
}

这是上面代码片段的结果。第一组是将转换java.util.Date为新的Date Time API。第二组是从转换java.util.Calendar为新的Date Time API。

java.util.Date          = Mon Feb 01 11:09:55 WITA 2016
java.time.LocalDate     = 2016-02-01
java.time.LocalTime     = 11:09:55.746
java.time.LocalDateTime = 2016-02-01T11:09:55.746
java.util.Date          = Mon Feb 01 11:09:55 WITA 2016

java.util.Calendar      = java.util.GregorianCalendar[time=1454296195871,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Makassar",offset=28800000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=9,SECOND=55,MILLISECOND=871,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.time.LocalDateTime = 2016-02-01T11:09:55.871
java.time.LocalDate     = 2016-02-01
java.time.LocalTime     = 11:09:55.871
java.util.Calendar      = java.util.GregorianCalendar[time=1454296195871,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Makassar",offset=28800000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=1,WEEK_OF_YEAR=5,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=9,SECOND=55,MILLISECOND=871,ZONE_OFFSET=28800000,DST_OFFSET=0]