diff --git a/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java new file mode 100644 index 0000000000..b67ac61caf --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java @@ -0,0 +1,24 @@ +package com.baeldung.utiltosqldate; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.TimeZone; + +public class UtilToSqlDateUtils { + + public static java.util.Date createAmericanDate(String date) throws ParseException { + SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + isoFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); + return isoFormat.parse(date); + } + + public static void switchTimezone(String timeZone) { + TimeZone.setDefault(TimeZone.getTimeZone(timeZone)); + } + + public static LocalDate getLocalDate(java.util.Date date, String timeZone) { + return date.toInstant().atZone(ZoneId.of(timeZone)).toLocalDate(); + } +} diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java new file mode 100644 index 0000000000..50847a6fa9 --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.utiltosqldate; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.text.ParseException; + +public class UtilToSqlDateUtilsUnitTest { + + @Test + public void givenUtilDate_whenCastingToSqlDate_thenThrowException() { + Assertions.assertThrows(ClassCastException.class, () -> { + java.sql.Date date = (java.sql.Date) new java.util.Date(); + }); + } + + @Test + public void givenUtilDate_whenStandardConversion_thenTimezoneLost() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + + java.sql.Date sqlDate = new java.sql.Date(date.getTime()); + Assertions.assertEquals("2010-05-23", sqlDate.toString()); + + UtilToSqlDateUtils.switchTimezone("Rome"); + sqlDate = new java.sql.Date(date.getTime()); + Assertions.assertEquals("2010-05-24",sqlDate.toString()); + } + + @Test + public void givenUtilDate_whenConversionToTimestamp_thenKeepTimeInfo() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime()); + Assertions.assertEquals("2010-05-23 22:01:02.0",timestamp.toString()); + } + + @Test + public void givenUtilDate_whenUsingJavaTimeConversion_thenTimezoneKept() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + + java.time.LocalDate localDate = UtilToSqlDateUtils.getLocalDate(date,"America/Los_Angeles"); + Assertions.assertEquals(localDate.toString(), "2010-05-23"); + + UtilToSqlDateUtils.switchTimezone("Rome"); + localDate = UtilToSqlDateUtils.getLocalDate(date,"America/Los_Angeles"); + Assertions.assertEquals(localDate.toString(), "2010-05-23"); + } + +}