How to make quick use of LocalDate to deal with common date operations, like birthdates, in Java.
package com.windofkeltia.leap; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import org.junit.runners.MethodSorters; @FixMethodOrder( MethodSorters.JVM ) public class LocalDateTimeFunTest { @Rule public TestName name = new TestName(); @Before public void setUp() { String testName = name.getMethodName(); int PAD = 100; int nameWidth = testName.length(); System.out.print( "Test: " + testName + " " ); PAD -= nameWidth; while( PAD-- > 0 ) System.out.print( "-" ); System.out.println(); } private static final boolean VERBOSE = true; @Test public void testYyyyMmDdIso() { String date = "19550118"; DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE; LocalDate timestamp = LocalDate.parse( date, formatter ); if( VERBOSE ) System.out.println( " " + timestamp ); } @Test public void testYyyyMmDd() { String date = "1955-01-18"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate timestamp = LocalDate.parse( date, formatter ); if( VERBOSE ) System.out.println( " " + timestamp ); } @Test public void testYyyyMmDdHhMm() { String date = "1955-01-18 04:32"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ); LocalDateTime timestamp = LocalDateTime.parse( date, formatter ); if( VERBOSE ) System.out.println( " " + timestamp ); } @Test public void testJumble1() { String date = "Tuesday, 16 August 2016, 12:10:56 PM"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE, d MMMM yyyy, HH:mm:ss a" ); LocalDateTime timestamp = LocalDateTime.parse( date, formatter ); if( VERBOSE ) System.out.println( " " + timestamp ); } @Test public void testJumble2() { String date = "Tuesday, Aug 16, 2016 12:10:56 PM"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE, MMM d, yyyy HH:mm:ss a" ); LocalDateTime timestamp = LocalDateTime.parse( date, formatter ); if( VERBOSE ) System.out.println( " " + timestamp ); } @Test public void testWithTimeZone1() { String date = "2016-08-16T15:23:01Z"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE, MMM d, yyyy HH:mm:ss a" ); Instant instant = Instant.parse( date ); LocalDateTime timestamp = LocalDateTime.ofInstant( instant, ZoneId.of( ZoneOffset.UTC.getId() ) ); if( VERBOSE ) { System.out.println( " " + timestamp ); ZonedDateTime zonedDateTime = instant.atZone( ZoneId.of( "Asia/Tokyo" ) ); System.out.println( " " + zonedDateTime ); ZonedDateTime zonedDateTime2 = instant.atZone( ZoneId.of( "America/Denver" ) ); System.out.println( " " + zonedDateTime2 ); ZonedDateTime zonedDateTime3 = instant.atZone( ZoneId.of( "Europe/Athens" ) ); System.out.println( " " + zonedDateTime3 ); } } @Test public void testWithTimeZone2() { String date = "2016-08-16T10:15:30+08:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE, MMM d, yyyy HH:mm:ss a" ); ZonedDateTime timestamp = ZonedDateTime.parse( date, DateTimeFormatter.ISO_DATE_TIME ); if( VERBOSE ) { System.out.println( " Local date: " + timestamp.toLocalDate() ); System.out.println( " Time in timezone: " + timestamp ); System.out.println( " Timezone: " + timestamp.getZone() ); } } }
Output:
Test: testYyyyMmDdIso ---------------------------------------------------------------------------- 1955-01-18 Test: testYyyyMmDd ------------------------------------------------------------------------------- 1955-01-18 Test: testYyyyMmDdHhMm --------------------------------------------------------------------------- 1955-01-18T04:32 Test: testJumble1 -------------------------------------------------------------------------------- 2016-08-16T12:10:56 Test: testJumble2 -------------------------------------------------------------------------------- 2016-08-16T12:10:56 Test: testWithTimeZone1 -------------------------------------------------------------------------- 2016-08-16T15:23:01 2016-08-17T00:23:01+09:00[Asia/Tokyo] 2016-08-16T09:23:01-06:00[America/Denver] 2016-08-16T18:23:01+03:00[Europe/Athens] Test: testWithTimeZone2 -------------------------------------------------------------------------- Local date: 2016-08-16 Time in timezone: 2016-08-16T10:15:30+08:00 Timezone: +08:00