From f161a383341061374c4cc3a8d57bf559b5b69d0d Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Tue, 30 Jul 2019 16:19:06 +0200 Subject: [PATCH] FIX: Regression of #1775 - set date for other platfroms broken, when ebean.dataTimeZone is set to GMT --- .../server/core/timezone/DataTimeZone.java | 11 ++++++++++- .../server/core/timezone/LocalDataTimeZone.java | 5 +++++ .../java/io/ebeaninternal/server/type/DataBind.java | 2 +- .../io/ebeaninternal/server/type/RsetDataReader.java | 2 +- .../java/org/tests/model/types/SomeNewTypesBean.java | 10 ++++++++++ src/test/java/org/tests/types/TestNewTypes.java | 5 +++++ 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/core/timezone/DataTimeZone.java b/src/main/java/io/ebeaninternal/server/core/timezone/DataTimeZone.java index c86bc19d5..775e826d1 100644 --- a/src/main/java/io/ebeaninternal/server/core/timezone/DataTimeZone.java +++ b/src/main/java/io/ebeaninternal/server/core/timezone/DataTimeZone.java @@ -8,7 +8,16 @@ import java.util.Calendar; public interface DataTimeZone { /** - * Return the Calendar to use for Timezone information. + * Return the Calendar to use for Timezone information when reading/writing timestamps. */ Calendar getTimeZone(); + + /** + * Return the Calendar to use for Timezone information when reading/writing date. + * A 'date' only value has normally no timezone information, but some platforms (like MySQL) + * reqire this. + */ + default Calendar getDateTimeZone() { + return null; + } } diff --git a/src/main/java/io/ebeaninternal/server/core/timezone/LocalDataTimeZone.java b/src/main/java/io/ebeaninternal/server/core/timezone/LocalDataTimeZone.java index d67defd7f..f128240ce 100644 --- a/src/main/java/io/ebeaninternal/server/core/timezone/LocalDataTimeZone.java +++ b/src/main/java/io/ebeaninternal/server/core/timezone/LocalDataTimeZone.java @@ -17,4 +17,9 @@ public class LocalDataTimeZone implements DataTimeZone { public Calendar getTimeZone() { return zone; } + + @Override + public Calendar getDateTimeZone() { + return zone; // workaround for MySQL. TODO: rename class to MySqlDataTimeZone!? + } } diff --git a/src/main/java/io/ebeaninternal/server/type/DataBind.java b/src/main/java/io/ebeaninternal/server/type/DataBind.java index 9329f282c..4d1e35c19 100644 --- a/src/main/java/io/ebeaninternal/server/type/DataBind.java +++ b/src/main/java/io/ebeaninternal/server/type/DataBind.java @@ -141,7 +141,7 @@ public class DataBind { } public void setDate(java.sql.Date v) throws SQLException { - Calendar timeZone = dataTimeZone.getTimeZone(); + Calendar timeZone = dataTimeZone.getDateTimeZone(); if (timeZone != null) { pstmt.setDate(++pos, v, timeZone); } else { diff --git a/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java b/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java index 6124495a1..666f0b600 100644 --- a/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java +++ b/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java @@ -106,7 +106,7 @@ public class RsetDataReader implements DataReader { @Override public Date getDate() throws SQLException { - Calendar cal = dataTimeZone.getTimeZone(); + Calendar cal = dataTimeZone.getDateTimeZone(); if (cal != null) { return rset.getDate(pos(), cal); } else { diff --git a/src/test/java/org/tests/model/types/SomeNewTypesBean.java b/src/test/java/org/tests/model/types/SomeNewTypesBean.java index a3baf0074..2397279cd 100644 --- a/src/test/java/org/tests/model/types/SomeNewTypesBean.java +++ b/src/test/java/org/tests/model/types/SomeNewTypesBean.java @@ -48,6 +48,8 @@ public class SomeNewTypesBean { java.sql.Date sqlDate; + java.sql.Time sqlTime; + LocalDate localDate; LocalDateTime localDateTime; @@ -134,6 +136,14 @@ public class SomeNewTypesBean { this.sqlDate = sqlDate; } + public java.sql.Time getSqlTime() { + return sqlTime; + } + + public void setSqlTime(java.sql.Time sqlTime) { + this.sqlTime = sqlTime; + } + public LocalDate getLocalDate() { return localDate; } diff --git a/src/test/java/org/tests/types/TestNewTypes.java b/src/test/java/org/tests/types/TestNewTypes.java index 900b2f470..e8a75a4de 100644 --- a/src/test/java/org/tests/types/TestNewTypes.java +++ b/src/test/java/org/tests/types/TestNewTypes.java @@ -43,6 +43,7 @@ public class TestNewTypes extends BaseTestCase { bean.setZonedDateTime(ZonedDateTime.now()); bean.setLocalTime(LocalTime.now()); bean.setSqlDate(java.sql.Date.valueOf("2019-07-21")); + bean.setSqlTime(java.sql.Time.valueOf("12:34:56")); bean.setInstant(Instant.now()); bean.setYear(Year.now()); bean.setMonth(Month.APRIL); @@ -81,6 +82,9 @@ public class TestNewTypes extends BaseTestCase { list = DB.find(SomeNewTypesBean.class).where().eq("sqlDate", bean.getSqlDate()).findList(); assertTrue(!list.isEmpty()); + list = DB.find(SomeNewTypesBean.class).where().eq("sqlTime", bean.getSqlTime()).findList(); + assertTrue(!list.isEmpty()); + list = DB.find(SomeNewTypesBean.class).where().le("localTime", LocalTime.now()).findList(); assertTrue(!list.isEmpty()); @@ -118,6 +122,7 @@ public class TestNewTypes extends BaseTestCase { assertEquals(bean.getMonth(), fetched.getMonth()); assertEquals(bean.getYear(), fetched.getYear()); assertEquals(bean.getSqlDate(), fetched.getSqlDate()); + assertEquals(bean.getSqlTime(), fetched.getSqlTime()); assertEquals(bean.getYearMonth(), fetched.getYearMonth()); assertEquals(bean.getMonthDay(), fetched.getMonthDay()); assertEquals(bean.getLocalDate(), fetched.getLocalDate());