Java 8 has introduced a new API specific to time including the package java.time.* and calendar classes including LocalDateTime, ZonedDateTime, LocalDate, LocalTime, Period, etc. It also provides the class java.time.format.DateTimeFormatter used by the calendar classes to format date/time objects for output. It also parses the input strings and converts them to date/time objects.
Also, the objects of DateTimeFormatter are immutable i.e., once created the objects cannot be changed. The object can be used to create new objects, but the object itself won't change.
Formatting using Pre-Defined or In-Built Instances
The class DateTimeFormatter comes with pre-defined date and time formats following the ISO and RFC standards. This section provides the details to utilize the existing date and time formats provided by the DateTimeFormatter class. The default calendar system followed by these classes is ISO-8601.
We can use the ISO_LOCAL_DATE pre-defined instance to convert the LocalDate object to the ISO format as shown below.
// Get The pre-defined or in-built Formatter object DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
// Get Today's date LocalDate today = LocalDate.now();
// Convert date to ISO String todayInIso = isoFormatter.format( today );
// Print the date in ISO System.out.println( "Today in ISO: " + todayInIso );
// Output Today in ISO: 2021-04-15
Similarly, we can use the RFC_1123_DATE_TIME pre-defined instance to convert the LocalDateTime object to the RFC 1123 format as shown below. RFC-1123 stands for Requirement for Internet Hosts and published by the IETF.
// Get The pre-defined or in-built Formatter object DateTimeFormatter rfc1123Formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
// Get Date and Time LocalDateTime now = LocalDateTime.now();
// Convert to RFC 1123 String nowInRFC1123 = rfc1123Formatter.format( now.atZone( ZoneId.of( "UTC" ) ) );
// Print in RFC 1123 System.out.println( "Now in RFC 1123: " + nowInRFC1123 );
// Output Now in RFC 1123: Thu, 15 Apr 2021 21:51:25 GMT
We can also format the ZonedDateTime as shown below. We can directly use the ZonedDateTime object without specifying the zone as we did in the previous example.
// Get The pre-defined or in-built Formatter object DateTimeFormatter rfc1123Formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
// Get Date and Time ZonedDateTime now = ZonedDateTime.now();
// Convert to RFC 1123 String nowInRFC1123 = rfc1123Formatter.format( now );
// Print in RFC 1123 System.out.println( "Now in RFC 1123: " + nowInRFC1123 );
// Output Now in RFC 1123: Thu, 15 Apr 2021 22:08:47 +0530
Formatting using Custom Formatter
We can also create custom formatter objects by defining our own pattern as shown below.
// Define custom patterns DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy - hh:mma z" );
// Get Date and Time LocalDateTime now = LocalDateTime.now();
// Convert to RFC 1123 String nowInCustom = customFormatter.format( now.atZone( ZoneId.of( "UTC" ) ) );
// Print in RFC 1123 System.out.println( "Now in Custom Format: " + nowInCustom );
// Output Now in Custom Format: 04/15/2021 - 10:04pm UTC
We can also format the LocalDate and LocalTime objects using the custom formatter as shown below.
// Get The pre-defined or in-built Formatter object DateTimeFormatter customDateFormatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" ); DateTimeFormatter customTimeFormatter = DateTimeFormatter.ofPattern( "hh:mma" );
// Get Date LocalDate today = LocalDate.now(); LocalTime now = LocalTime.now();
// Convert date to string String todayStr = customDateFormatter.format( today );
// Convert time to string String nowStr = customTimeFormatter.format( now );
// Print in RFC 1123 System.out.println( "Today is: " + todayStr + " At: " + nowStr );
// Output: Today is: 04/15/2021 At: 10:22pm
Useful Patterns
The below-mentioned table lists some of the useful patterns with example
Pattern | Example |
---|---|
yyyy-MM-dd | 2021-04-15 |
yyyy-MM-dd hh:mm:ss | 2021-04-15 10:47:28 |
dd-MM-yyyy | 15-04-2021 |
dd-MMM-yyyy | 15-July-2021 |
dd/MM/yyyy | 15/04/2021 |
E, MMM dd yyyy | Thu, Apr 15 2021 |
hh:mm a | 10:44 pm |
EEEE, MMM dd, yyyy HH:mm:ss a | Thursday, Apr 15, 2021 22:45:59 pm |
Summary
This tutorial provided examples to format the objects of ZonedDateTime, LocalDateTime, LocalDate, and LocalTime using the in-built and custom formatter objects of the DateTimeFormatter class. It also provided the list of commonly used patterns with examples.