diff --git a/src/main/java/com/cedarsoftware/util/DateUtilities.java b/src/main/java/com/cedarsoftware/util/DateUtilities.java index ae251165..1336edd2 100644 --- a/src/main/java/com/cedarsoftware/util/DateUtilities.java +++ b/src/main/java/com/cedarsoftware/util/DateUtilities.java @@ -260,9 +260,10 @@ public static ZonedDateTime parseDate(String dateStr, ZoneId defaultZoneId, bool tz = matcher.group(5).trim(); } if (matcher.group(6) != null) { - if (StringUtilities.isEmpty(tz)) { // Only use timezone name when offset is not used - tz = stripBrackets(matcher.group(6).trim()); - } + // to make round trip of ZonedDateTime equivalent we need to use the original Zone as ZoneId + // ZoneId is a much broader definition handling multiple possible dates, and we want this to + // be equivalent to the original zone that was used if one was present. + tz = stripBrackets(matcher.group(6).trim()); } } diff --git a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java index 38836506..192aca4b 100644 --- a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java @@ -378,6 +378,10 @@ static ZoneId toZoneId(Object from, Converter converter) { ConverterOptions options = converter.getOptions(); ZoneId zoneId = converter.convert(map.get(ZONE), ZoneId.class); return zoneId; + } else if (map.containsKey(ID)) { + ConverterOptions options = converter.getOptions(); + ZoneId zoneId = converter.convert(map.get(ID), ZoneId.class); + return zoneId; } else { return fromSingleKey(from, converter, ZONE, ZoneId.class); } diff --git a/src/test/java/com/cedarsoftware/util/TestDateUtilities.java b/src/test/java/com/cedarsoftware/util/TestDateUtilities.java index e9e73a65..6652e50b 100644 --- a/src/test/java/com/cedarsoftware/util/TestDateUtilities.java +++ b/src/test/java/com/cedarsoftware/util/TestDateUtilities.java @@ -1,11 +1,5 @@ package com.cedarsoftware.util; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; - import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.text.SimpleDateFormat; @@ -17,6 +11,12 @@ import java.util.TimeZone; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; diff --git a/src/test/java/com/cedarsoftware/util/convert/ZonedDateTimeConversionsTests.java b/src/test/java/com/cedarsoftware/util/convert/ZonedDateTimeConversionsTests.java index e4e981fd..62d59971 100644 --- a/src/test/java/com/cedarsoftware/util/convert/ZonedDateTimeConversionsTests.java +++ b/src/test/java/com/cedarsoftware/util/convert/ZonedDateTimeConversionsTests.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; @@ -10,7 +11,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import static org.assertj.core.api.Assertions.assertThat; +import com.cedarsoftware.util.DeepEquals; + +import static org.junit.jupiter.api.Assertions.assertTrue; class ZonedDateTimeConversionsTests { @@ -44,11 +47,13 @@ private static Stream roundTripZDT() { void testZonedDateTime(ZonedDateTime zdt) { String value = this.converter.convert(zdt, String.class); - System.out.println(value); ZonedDateTime actual = this.converter.convert(value, ZonedDateTime.class); - System.out.println(actual); - assertThat(actual).isEqualTo(zdt); - } + assertTrue(DeepEquals.deepEquals(actual, zdt)); + value = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zdt); + actual = this.converter.convert(value, ZonedDateTime.class); + + assertTrue(DeepEquals.deepEquals(actual, zdt)); + } }