From c504623295e3e3406d4aa6621a8316ee75d4c423 Mon Sep 17 00:00:00 2001 From: denizh Date: Wed, 14 Nov 2007 19:30:09 +0000 Subject: Changes related to displaying dates correctly due to wrong zones --- .../amazon/carbonado/adapter/DateTimeAdapter.java | 123 +++++++++++++-------- 1 file changed, 77 insertions(+), 46 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/amazon/carbonado/adapter/DateTimeAdapter.java b/src/main/java/com/amazon/carbonado/adapter/DateTimeAdapter.java index fc12319..d9b3577 100644 --- a/src/main/java/com/amazon/carbonado/adapter/DateTimeAdapter.java +++ b/src/main/java/com/amazon/carbonado/adapter/DateTimeAdapter.java @@ -76,6 +76,12 @@ public @interface DateTimeAdapter { * default time zone. */ String timeZone() default ""; + + /** + * Optionally specify a time zone for the DateTime value as persisted. + */ + String timeZonePersisted() default ""; + String timeZoneActual() default ""; /** * Adapter implementation for {@link DateTimeAdapter}. @@ -124,7 +130,7 @@ public @interface DateTimeAdapter { .toFormatter(); } - private static DateTimeZone toDateTimeZone(DateTimeAdapter ann) { + private static DateTimeZone getDisplayDateTimeZone(DateTimeAdapter ann) { String id; if (ann == null || (id = ann.timeZone()) == null || id.length() == 0) { return null; @@ -132,8 +138,26 @@ public @interface DateTimeAdapter { return DateTimeZone.forID(id); } + private static DateTimeZone getPersistedDateTimeZone(DateTimeAdapter ann) { + String id; + if (ann == null || (id = ann.timeZonePersisted()) == null || id.length() == 0) { + return getDisplayDateTimeZone(ann); + } + return DateTimeZone.forID(id); + } + + private static DateTimeZone getActualDateTimeZone(DateTimeAdapter ann) { + String id; + if (ann == null || (id = ann.timeZoneActual()) == null || id.length() == 0) { + return getDisplayDateTimeZone(ann); + } + return DateTimeZone.forID(id); + } + private final String mPropertyName; - private final DateTimeZone mZone; + private final DateTimeZone mPersistedZone; + private final DateTimeZone mActualZone; + private final DateTimeZone mDisplayZone; private final DateTimeFormatter mDateTimeParser; /** @@ -142,7 +166,7 @@ public @interface DateTimeAdapter { * @param ann specific annotation that binds to this adapter class */ public Adapter(Class type, String propertyName, DateTimeAdapter ann) { - this(type, propertyName, toDateTimeZone(ann)); + this(type, propertyName, getDisplayDateTimeZone(ann), getPersistedDateTimeZone(ann), getActualDateTimeZone(ann)); } /** @@ -150,20 +174,27 @@ public @interface DateTimeAdapter { * @param propertyName name of property with * @param zone time zone to apply, or null to use default */ - public Adapter(Class type, String propertyName, DateTimeZone zone) { + public Adapter(Class type, String propertyName, DateTimeZone displayZone, DateTimeZone persistedZone, DateTimeZone actualZone) { mPropertyName = propertyName; - mZone = zone; - mDateTimeParser = cDateTimeParser.withZone(zone); + mDisplayZone = displayZone; + mPersistedZone = persistedZone; + mActualZone = actualZone; + if (!mPersistedZone.equals(mActualZone)) + DateTimeZone.setDefault(mActualZone); + mDateTimeParser = cDateTimeParser.withZone(persistedZone); } + public Adapter(Class type, String propertyName, DateTimeZone displayZone) { + this(type, propertyName, displayZone, displayZone, displayZone); + } // Adapt to DateTime... public DateTime adaptToDateTime(long instant) { - return new DateTime(instant, mZone); + return new DateTime(instant, mPersistedZone); } public DateTime adaptToDateTime(Long instant) { - return instant == null ? null : new DateTime(instant, mZone); + return instant == null ? null : (new DateTime(instant, mPersistedZone).withZoneRetainFields(mActualZone)).withZone(mDisplayZone); } public DateTime adaptToDateTime(String isoDateString) { @@ -171,116 +202,116 @@ public @interface DateTimeAdapter { } public DateTime adaptToDateTime(Date date) { - return date == null ? null : new DateTime(date, mZone); + return date == null ? null : (new DateTime(date, mPersistedZone).withZoneRetainFields(mActualZone)).withZone(mDisplayZone); } public DateTime adaptToDateTime(java.sql.Date date) { - return date == null ? null : new DateTime(date.getTime(), mZone); + return date == null ? null : new DateTime(date.getTime(), mPersistedZone).withZoneRetainFields(mActualZone).withZone(mDisplayZone); } public DateTime adaptToDateTime(Time time) { - return time == null ? null : new DateTime(time.getTime(), mZone); + return time == null ? null : new DateTime(time.getTime(), mPersistedZone).withZoneRetainFields(mActualZone).withZone(mDisplayZone); } public DateTime adaptToDateTime(Timestamp timestamp) { - return timestamp == null ? null : new DateTime(timestamp.getTime(), mZone); + return timestamp == null ? null : new DateTime(timestamp.getTime(), mPersistedZone).withZoneRetainFields(mActualZone).withZone(mDisplayZone); } // Adapt to DateMidnight... public DateMidnight adaptToDateMidnight(long instant) { - return new DateMidnight(instant, mZone); + return new DateMidnight(instant, mPersistedZone); } public DateMidnight adaptToDateMidnight(Long instant) { - return instant == null ? null : new DateMidnight(instant, mZone); + return instant == null ? null : new DateMidnight(instant, mPersistedZone); } public DateMidnight adaptToDateMidnight(String isoDateString) { - return isoDateString == null ? null : new DateMidnight(isoDateString, mZone); + return isoDateString == null ? null : new DateMidnight(isoDateString, mPersistedZone); } public DateMidnight adaptToDateMidnight(Date date) { - return date == null ? null : new DateMidnight(date, mZone); + return date == null ? null : new DateMidnight(date, mPersistedZone); } public DateMidnight adaptToDateMidnight(java.sql.Date date) { - return date == null ? null : new DateMidnight(date.getTime(), mZone); + return date == null ? null : new DateMidnight(date.getTime(), mPersistedZone); } public DateMidnight adaptToDateMidnight(Time time) { - return time == null ? null : new DateMidnight(time.getTime(), mZone); + return time == null ? null : new DateMidnight(time.getTime(), mPersistedZone); } public DateMidnight adaptToDateMidnight(Timestamp timestamp) { - return timestamp == null ? null : new DateMidnight(timestamp.getTime(), mZone); + return timestamp == null ? null : new DateMidnight(timestamp.getTime(), mPersistedZone); } // Adapt to LocalDateTime... public LocalDateTime adaptToLocalDateTime(long instant) { - return new LocalDateTime(instant, mZone); + return new LocalDateTime(instant, mPersistedZone); } public LocalDateTime adaptToLocalDateTime(Long instant) { - return instant == null ? null : new LocalDateTime(instant, mZone); + return instant == null ? null : new LocalDateTime(instant, mPersistedZone); } public LocalDateTime adaptToLocalDateTime(String isoDateString) { - return isoDateString == null ? null : new LocalDateTime(isoDateString, mZone); + return isoDateString == null ? null : new LocalDateTime(isoDateString, mPersistedZone); } public LocalDateTime adaptToLocalDateTime(Date date) { - return date == null ? null : new LocalDateTime(date, mZone); + return date == null ? null : new LocalDateTime(date, mPersistedZone); } public LocalDateTime adaptToLocalDateTime(java.sql.Date date) { - return date == null ? null : new LocalDateTime(date.getTime(), mZone); + return date == null ? null : new LocalDateTime(date.getTime(), mPersistedZone); } public LocalDateTime adaptToLocalDateTime(Time time) { - return time == null ? null : new LocalDateTime(time.getTime(), mZone); + return time == null ? null : new LocalDateTime(time.getTime(), mPersistedZone); } public LocalDateTime adaptToLocalDateTime(Timestamp timestamp) { - return timestamp == null ? null : new LocalDateTime(timestamp.getTime(), mZone); + return timestamp == null ? null : new LocalDateTime(timestamp.getTime(), mPersistedZone); } // Adapt to LocalDate... public LocalDate adaptToLocalDate(long instant) { - return new LocalDate(instant, mZone); + return new LocalDate(instant, mPersistedZone); } public LocalDate adaptToLocalDate(Long instant) { - return instant == null ? null : new LocalDate(instant, mZone); + return instant == null ? null : new LocalDate(instant, mPersistedZone); } public LocalDate adaptToLocalDate(String isoDateString) { - return isoDateString == null ? null : new LocalDate(isoDateString, mZone); + return isoDateString == null ? null : new LocalDate(isoDateString, mPersistedZone); } public LocalDate adaptToLocalDate(Date date) { - return date == null ? null : new LocalDate(date, mZone); + return date == null ? null : new LocalDate(date, mPersistedZone); } public LocalDate adaptToLocalDate(java.sql.Date date) { - return date == null ? null : new LocalDate(date.getTime(), mZone); + return date == null ? null : new LocalDate(date.getTime(), mPersistedZone); } public LocalDate adaptToLocalDate(Time time) { - return time == null ? null : new LocalDate(time.getTime(), mZone); + return time == null ? null : new LocalDate(time.getTime(), mPersistedZone); } public LocalDate adaptToLocalDate(Timestamp timestamp) { - return timestamp == null ? null : new LocalDate(timestamp.getTime(), mZone); + return timestamp == null ? null : new LocalDate(timestamp.getTime(), mPersistedZone); } // Adapt from DateTime and DateMidnight... (accept the more generic ReadableInstant) public long adaptToLong(ReadableInstant instant) { if (instant != null) { - return instant.getMillis(); + return new DateTime(instant, mDisplayZone).withZoneRetainFields(mPersistedZone).getMillis(); } throw new IllegalArgumentException ("Cannot adapt null instant into long for property \"" + @@ -315,7 +346,7 @@ public @interface DateTimeAdapter { public long adaptToLong(LocalDateTime dateTime) { if (dateTime != null) { - return dateTime.toDateTime(mZone).getMillis(); + return dateTime.toDateTime(mPersistedZone).getMillis(); } throw new IllegalArgumentException ("Cannot adapt null datetime into long for property \"" + @@ -323,7 +354,7 @@ public @interface DateTimeAdapter { } public Long adaptToLongObj(LocalDateTime dateTime) { - return dateTime == null ? null : dateTime.toDateTime(mZone).getMillis(); + return dateTime == null ? null : dateTime.toDateTime(mPersistedZone).getMillis(); } public String adaptToString(LocalDateTime dateTime) { @@ -331,27 +362,27 @@ public @interface DateTimeAdapter { } public Date adaptToDate(LocalDateTime dateTime) { - return dateTime == null ? null : dateTime.toDateTime(mZone).toDate(); + return dateTime == null ? null : dateTime.toDateTime(mPersistedZone).toDate(); } public java.sql.Date adaptToSqlDate(LocalDateTime dateTime) { return dateTime == null ? null - : new java.sql.Date(dateTime.toDateTime(mZone).getMillis()); + : new java.sql.Date(dateTime.toDateTime(mPersistedZone).getMillis()); } public Time adaptToSqlTime(LocalDateTime dateTime) { - return dateTime == null ? null : new Time(dateTime.toDateTime(mZone).getMillis()); + return dateTime == null ? null : new Time(dateTime.toDateTime(mPersistedZone).getMillis()); } public Timestamp adaptToSqlTimestamp(LocalDateTime dateTime) { - return dateTime == null ? null : new Timestamp(dateTime.toDateTime(mZone).getMillis()); + return dateTime == null ? null : new Timestamp(dateTime.toDateTime(mPersistedZone).getMillis()); } // Adapt from LocalDate... public long adaptToLong(LocalDate date) { if (date != null) { - return date.toDateMidnight(mZone).getMillis(); + return date.toDateMidnight(mPersistedZone).getMillis(); } throw new IllegalArgumentException ("Cannot adapt null date into long for property \"" + @@ -359,7 +390,7 @@ public @interface DateTimeAdapter { } public Long adaptToLongObj(LocalDate date) { - return date == null ? null : date.toDateMidnight(mZone).getMillis(); + return date == null ? null : date.toDateMidnight(mPersistedZone).getMillis(); } public String adaptToString(LocalDate date) { @@ -367,15 +398,15 @@ public @interface DateTimeAdapter { } public Date adaptToDate(LocalDate date) { - return date == null ? null : date.toDateMidnight(mZone).toDate(); + return date == null ? null : date.toDateMidnight(mPersistedZone).toDate(); } public java.sql.Date adaptToSqlDate(LocalDate date) { - return date == null ? null : new java.sql.Date(date.toDateMidnight(mZone).getMillis()); + return date == null ? null : new java.sql.Date(date.toDateMidnight(mPersistedZone).getMillis()); } public Timestamp adaptToSqlTimestamp(LocalDate date) { - return date == null ? null : new Timestamp(date.toDateMidnight(mZone).getMillis()); + return date == null ? null : new Timestamp(date.toDateMidnight(mPersistedZone).getMillis()); } // Adapt to Date... @@ -421,7 +452,7 @@ public @interface DateTimeAdapter { } public String adaptToString(Date date) { - return date == null ? null : new DateTime(date, mZone).toString(); + return date == null ? null : new DateTime(date, mPersistedZone).toString(); } public java.sql.Date adaptToSqlDate(Date date) { -- cgit v1.2.3