In this example we will learn how to convert the old java.util.Date
and java.util.Calendar
objects to the new Date Time introduced in Java 8. The first method in the code snippet below dateToNewDate()
show conversion of java.util.Date
while the calendarToNewDate()
show the conversion of java.util.Calendar
.
The java.util.Date
and java.util.Calendar
provide a toInstant()
method to convert the objects to the new Date Time API class of the java.time.Instant
. To convert the old date into the Java 8 LocalDate
, LocalTime
and LocalDateTime
we first can create an instance of ZonedDateTime
using the atZone()
method of the Instant
class.
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
From an instance of ZonedDateTime
class we can call the toLocalDate()
, toLocalTime()
and toLocalDateTime()
to get instance of LocalDate
, LocalTime
and LocalDateTime
.
To convert back from the new Java 8 date to the old java.util.Date
we can use the Date.from()
static factory method and passing and instance of java.time.Instant
that we can obtain by calling the following code.
Instant instant1 = dateTime.atZone(ZoneId.systemDefault()).toInstant();
Date now1 = Date.from(instant1);
Here are the complete code snippet to convert java.util.Date
to the new 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();
}
The steps for converting from the java.util.Calendar
to the new Java 8 date can be seen in the code snippet below. As with java.util.Date
the Calendar
class provide toInstant()
method to convert the calendar to java.time.Instant
object.
Using the LocalDateTime.ofInstant()
method we can create a LocalDateTime
object from the instant object. By having the LocalDateTime
object we can then get an instance of LocalDate
and LocalTime
by calling the toLocalDate()
and toLocalTime()
method.
Finally, to convert back to java.util.Calendar
we can use the GregorianCalendar.from()
static factory method which require an instance of ZonedDateTime
to be passed as a parameter. To get an instance of ZonedDateTime
we can call LocalDateTime.atZone()
method. You can see the complete code in the code snippet below.
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);
}
Below is the main Java class to run the code snippet. You must place the above methods inside this class to run the code snippet.
package org.kodejava.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();
}
}
Here are the result of the code snippet above. The first group is conversion the java.util.Date
to the new Date Time API. The second group is conversion from the java.util.Calendar
to the new Date Time API.
java.util.Date = Tue Nov 16 08:44:51 CST 2021
java.time.LocalDate = 2021-11-16
java.time.LocalTime = 08:44:51.031
java.time.LocalDateTime = 2021-11-16T08:44:51.031
java.util.Date = Tue Nov 16 08:44:51 CST 2021
java.util.Calendar = java.util.GregorianCalendar[time=1637023491089,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=3,DAY_OF_MONTH=16,DAY_OF_YEAR=320,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=44,SECOND=51,MILLISECOND=89,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.time.LocalDateTime = 2021-11-16T08:44:51.089
java.time.LocalDate = 2021-11-16
java.time.LocalTime = 08:44:51.089
java.util.Calendar = java.util.GregorianCalendar[time=1637023491089,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2021,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=3,DAY_OF_MONTH=16,DAY_OF_YEAR=320,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=44,SECOND=51,MILLISECOND=89,ZONE_OFFSET=28800000,DST_OFFSET=0]
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024