如何使用新的Java 8 Date Time在旧的Date和Calendar对象之间转换?
在此示例中,我们将学习如何将旧对象java.util.Date和java.util.Calendar对象转换为Java8中引入的新的DateTime。下面的代码片段中的第一种方法dateToNewDate()show的转换,java.util.Date而calendarToNewDate()show的转换java.util.Calendar。
该java.util.Date和java.util.Calendar提供toInstant()给对象转换为新的日期时间API类的方法java.time.Instant。旧日期转换到Java8LocalDate,LocalTime和LocalDateTime我们第一次可以创建的实例ZonedDateTime使用atZone()的方法Instant类。
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
从实例ZonedDateTime类,我们可以调用toLocalDate(),toLocalTime()并且toLocalDateTime()得到的实例LocalDate,LocalTime和LocalDateTime。
为了将新的Java8日期转换回旧的日期,java.util.Date我们可以使用Date.from()静态工厂方法,并java.time.Instant通过调用以下代码获得传递的实例。
Instant instant1 = dateTime.atZone(ZoneId.systemDefault()).toInstant(); Date now1 = Date.from(instant1);
这是可转换java.util.Date为新的Java8DateTime的完整代码段。
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为新的Java8日期的步骤可以在下面的代码片段中找到。与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为新的DateTimeAPI。第二组是从转换java.util.Calendar为新的DateTimeAPI。
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]