From 55e9f29bed69a2f1dfa2d27d43fb6396f4c71abc Mon Sep 17 00:00:00 2001 From: Gus Brodman Date: Thu, 5 Sep 2019 14:53:42 -0400 Subject: [PATCH 1/3] Add DateTimeUtils conversion methods --- .../google/registry/util/DateTimeUtils.java | 21 +++++++++++ .../registry/util/DateTimeUtilsTest.java | 37 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/util/src/main/java/google/registry/util/DateTimeUtils.java b/util/src/main/java/google/registry/util/DateTimeUtils.java index 0aa0fa6178d..47a81011ca5 100644 --- a/util/src/main/java/google/registry/util/DateTimeUtils.java +++ b/util/src/main/java/google/registry/util/DateTimeUtils.java @@ -19,6 +19,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; +import java.time.ZoneId; +import java.time.ZonedDateTime; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -86,4 +88,23 @@ public static DateTime leapSafeSubtractYears(DateTime now, int years) { checkArgument(years >= 0); return years == 0 ? now : now.minusYears(1).minusYears(years - 1); } + + /** + * Converts a Joda {@link DateTime} object to an equivalent java.time {@link ZonedDateTime} + * object. + */ + public static ZonedDateTime toZonedDateTime(DateTime dateTime) { + java.time.Instant instant = java.time.Instant.ofEpochMilli(dateTime.getMillis()); + return ZonedDateTime.ofInstant(instant, ZoneId.of(dateTime.getZone().getID())); + } + + /** + * Converts a java.time {@link ZonedDateTime} object to an equivalent Joda {@link DateTime} + * object. + */ + public static DateTime toJodaDateTime(ZonedDateTime zonedDateTime) { + return new DateTime( + zonedDateTime.toInstant().toEpochMilli(), + DateTimeZone.forID(zonedDateTime.getZone().getId())); + } } diff --git a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java index f4e41da7d5b..76c668006f9 100644 --- a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java +++ b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java @@ -24,9 +24,14 @@ import static google.registry.util.DateTimeUtils.latestOf; import static google.registry.util.DateTimeUtils.leapSafeAddYears; import static google.registry.util.DateTimeUtils.leapSafeSubtractYears; +import static google.registry.util.DateTimeUtils.toJodaDateTime; +import static google.registry.util.DateTimeUtils.toZonedDateTime; import com.google.common.collect.ImmutableList; +import java.time.ZoneId; +import java.time.ZonedDateTime; import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -94,4 +99,36 @@ public void testFailure_earliestOfEmpty() { public void testFailure_latestOfEmpty() { assertThrows(IllegalArgumentException.class, () -> earliestOf(ImmutableList.of())); } + + @Test + public void testSuccess_toZonedDateTime() { + DateTime dateTime = DateTime.now(DateTimeZone.UTC); + ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); + assertThat(zonedDateTime.toInstant().toEpochMilli()).isEqualTo(dateTime.getMillis()); + assertThat(zonedDateTime.getZone().getId()).isEqualTo("UTC"); + } + + @Test + public void testSuccess_toZonedDateTime_preservesTimeZone() { + DateTime dateTime = DateTime.now(DateTimeZone.forID("America/Los_Angeles")); + ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); + assertThat(zonedDateTime.toInstant().toEpochMilli()).isEqualTo(dateTime.getMillis()); + assertThat(zonedDateTime.getZone().getId()).isEqualTo("America/Los_Angeles"); + } + + @Test + public void testSuccess_toJodaDateTime() { + ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("UTC")); + DateTime dateTime = toJodaDateTime(zonedDateTime); + assertThat(dateTime.getMillis()).isEqualTo(zonedDateTime.toInstant().toEpochMilli()); + assertThat(dateTime.getZone().getID()).isEqualTo("UTC"); + } + + @Test + public void testSuccess_toJodaDateTime_preservesTimeZone() { + ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")); + DateTime dateTime = toJodaDateTime(zonedDateTime); + assertThat(dateTime.getMillis()).isEqualTo(zonedDateTime.toInstant().toEpochMilli()); + assertThat(dateTime.getZone().getID()).isEqualTo("America/Los_Angeles"); + } } From ee9c2342feb7548cae24aa943b4e2c6a02a7210f Mon Sep 17 00:00:00 2001 From: Gus Brodman Date: Thu, 5 Sep 2019 19:14:19 -0400 Subject: [PATCH 2/3] Use a more reliabile method than getId --- util/src/main/java/google/registry/util/DateTimeUtils.java | 5 +++-- .../test/java/google/registry/util/DateTimeUtilsTest.java | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/util/src/main/java/google/registry/util/DateTimeUtils.java b/util/src/main/java/google/registry/util/DateTimeUtils.java index 47a81011ca5..362e8118e41 100644 --- a/util/src/main/java/google/registry/util/DateTimeUtils.java +++ b/util/src/main/java/google/registry/util/DateTimeUtils.java @@ -21,6 +21,7 @@ import com.google.common.collect.Ordering; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.TimeZone; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -95,7 +96,7 @@ public static DateTime leapSafeSubtractYears(DateTime now, int years) { */ public static ZonedDateTime toZonedDateTime(DateTime dateTime) { java.time.Instant instant = java.time.Instant.ofEpochMilli(dateTime.getMillis()); - return ZonedDateTime.ofInstant(instant, ZoneId.of(dateTime.getZone().getID())); + return ZonedDateTime.ofInstant(instant, ZoneId.of(dateTime.getZone().getID()).normalized()); } /** @@ -105,6 +106,6 @@ public static ZonedDateTime toZonedDateTime(DateTime dateTime) { public static DateTime toJodaDateTime(ZonedDateTime zonedDateTime) { return new DateTime( zonedDateTime.toInstant().toEpochMilli(), - DateTimeZone.forID(zonedDateTime.getZone().getId())); + DateTimeZone.forTimeZone(TimeZone.getTimeZone(zonedDateTime.getZone()))); } } diff --git a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java index 76c668006f9..d0ea08b97a0 100644 --- a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java +++ b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableList; import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.ZonedDateTime; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -105,7 +106,7 @@ public void testSuccess_toZonedDateTime() { DateTime dateTime = DateTime.now(DateTimeZone.UTC); ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); assertThat(zonedDateTime.toInstant().toEpochMilli()).isEqualTo(dateTime.getMillis()); - assertThat(zonedDateTime.getZone().getId()).isEqualTo("UTC"); + assertThat(zonedDateTime.getZone()).isEqualTo(ZoneOffset.UTC); } @Test @@ -118,10 +119,10 @@ public void testSuccess_toZonedDateTime_preservesTimeZone() { @Test public void testSuccess_toJodaDateTime() { - ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("UTC")); + ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC); DateTime dateTime = toJodaDateTime(zonedDateTime); assertThat(dateTime.getMillis()).isEqualTo(zonedDateTime.toInstant().toEpochMilli()); - assertThat(dateTime.getZone().getID()).isEqualTo("UTC"); + assertThat(dateTime.getZone()).isEqualTo(DateTimeZone.UTC); } @Test From 35e59c6c7ea2487570489b23d130b2bb6a852804 Mon Sep 17 00:00:00 2001 From: Gus Brodman Date: Fri, 6 Sep 2019 14:09:35 -0400 Subject: [PATCH 3/3] Add some more tests --- .../registry/util/DateTimeUtilsTest.java | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java index d0ea08b97a0..481296a8dee 100644 --- a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java +++ b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java @@ -28,11 +28,8 @@ import static google.registry.util.DateTimeUtils.toZonedDateTime; import com.google.common.collect.ImmutableList; -import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.ZonedDateTime; import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -102,34 +99,44 @@ public void testFailure_latestOfEmpty() { } @Test - public void testSuccess_toZonedDateTime() { - DateTime dateTime = DateTime.now(DateTimeZone.UTC); + public void testSuccess_toZonedDateTime_preservesTimeZone() { + DateTime dateTime = DateTime.parse("2019-09-06T10:59:36.283-07:00"); // PDT ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); - assertThat(zonedDateTime.toInstant().toEpochMilli()).isEqualTo(dateTime.getMillis()); - assertThat(zonedDateTime.getZone()).isEqualTo(ZoneOffset.UTC); + assertThat(zonedDateTime.toString()).isEqualTo("2019-09-06T10:59:36.283-07:00"); // still PDT } @Test - public void testSuccess_toZonedDateTime_preservesTimeZone() { - DateTime dateTime = DateTime.now(DateTimeZone.forID("America/Los_Angeles")); + public void testSuccess_toZonedDateTime_fromStringZulu() { + DateTime dateTime = DateTime.parse("2015-10-13T11:22:33.168Z"); ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); - assertThat(zonedDateTime.toInstant().toEpochMilli()).isEqualTo(dateTime.getMillis()); - assertThat(zonedDateTime.getZone().getId()).isEqualTo("America/Los_Angeles"); + assertThat(zonedDateTime.toString()).isEqualTo("2015-10-13T11:22:33.168Z"); } @Test - public void testSuccess_toJodaDateTime() { - ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC); - DateTime dateTime = toJodaDateTime(zonedDateTime); - assertThat(dateTime.getMillis()).isEqualTo(zonedDateTime.toInstant().toEpochMilli()); - assertThat(dateTime.getZone()).isEqualTo(DateTimeZone.UTC); + public void testSuccess_toZonedDateTime_leapYear() { + DateTime dateTime = DateTime.parse("2016-02-29T11:22:33.168Z"); + ZonedDateTime zonedDateTime = toZonedDateTime(dateTime); + assertThat(zonedDateTime.toString()).isEqualTo("2016-02-29T11:22:33.168Z"); } @Test public void testSuccess_toJodaDateTime_preservesTimeZone() { - ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")); + ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-09-06T10:59:36.283-07:00"); // PDT + DateTime dateTime = toJodaDateTime(zonedDateTime); + assertThat(dateTime.toString()).isEqualTo("2019-09-06T10:59:36.283-07:00"); // still PDT + } + + @Test + public void testSuccess_toJodaDateTime_fromStringZulu() { + ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-10-13T11:22:33.168Z"); + DateTime dateTime = toJodaDateTime(zonedDateTime); + assertThat(dateTime.toString()).isEqualTo("2015-10-13T11:22:33.168Z"); + } + + @Test + public void testSuccess_toJodaDateTime_leapYear() { + ZonedDateTime zonedDateTime = ZonedDateTime.parse("2016-02-29T11:22:33.168Z"); DateTime dateTime = toJodaDateTime(zonedDateTime); - assertThat(dateTime.getMillis()).isEqualTo(zonedDateTime.toInstant().toEpochMilli()); - assertThat(dateTime.getZone().getID()).isEqualTo("America/Los_Angeles"); + assertThat(dateTime.toString()).isEqualTo("2016-02-29T11:22:33.168Z"); } }