From 9e3d6c6a081a60798ce38a2e823b232efbd3e5e8 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Sun, 14 Feb 2021 10:28:55 +1300 Subject: [PATCH] #2165 - Joda LocalDate West of UTC converts incorrectly (Fix: change from epoc millis conversion to y/m/d conversion) --- .../server/type/ScalarTypeJodaLocalDate.java | 5 +++-- .../type/ScalarTypeJodaLocalDateTest.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java index b3d8aee8b..4727f1d58 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java @@ -37,9 +37,10 @@ public class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { return LocalDate.fromDateFields(date); } + @SuppressWarnings("deprecation") @Override public Date convertToDate(LocalDate value) { - return new java.sql.Date(convertToMillis(value)); + return new Date(value .getYear() - 1900, value .getMonthOfYear() - 1, value .getDayOfMonth()); } @Override @@ -53,7 +54,7 @@ public class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { @Override public LocalDate toBeanType(Object value) { if (value instanceof java.util.Date) { - return convertFromMillis(((java.util.Date) value).getTime()); + return LocalDate.fromDateFields((java.util.Date)value); } return (LocalDate) value; } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java index fc2246daf..250356338 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import java.io.IOException; import java.sql.Date; +import java.util.TimeZone; import static org.assertj.core.api.Assertions.assertThat; @@ -24,12 +25,29 @@ public class ScalarTypeJodaLocalDateTest { assertThat(localDate).isEqualTo(localDate1); } + @Test + public void convertToDate_convertFromDate_westOfUtc() { + final TimeZone originaDefaultTimezone = TimeZone.getDefault(); + try { + TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago")); + + convertDate(new LocalDate()); + convertDate(new LocalDate(1899, 12, 1)); + convertDate(new LocalDate(1900, 1, 1)); + convertDate(new LocalDate(2021, 2, 8)); + + } finally { + TimeZone.setDefault(originaDefaultTimezone); + } + } + @Test public void convertToDate_convertFromDate() { convertDate(new LocalDate()); convertDate(new LocalDate(1899, 12, 1)); convertDate(new LocalDate(1900, 1, 1)); + convertDate(new LocalDate(2021, 2, 8)); } private void convertDate(LocalDate localDate) {