From cbd7beadaef314efe64361583ff96005e65bdd70 Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Tue, 15 Nov 2022 11:21:30 +0100 Subject: [PATCH] Convert Duration to java.time.Duration --- src/main/java/io/airlift/units/Duration.java | 23 ++++++ .../java/io/airlift/units/TestDuration.java | 76 +++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/src/main/java/io/airlift/units/Duration.java b/src/main/java/io/airlift/units/Duration.java index b1c0c9e..b634dfb 100644 --- a/src/main/java/io/airlift/units/Duration.java +++ b/src/main/java/io/airlift/units/Duration.java @@ -24,6 +24,7 @@ import java.util.regex.Pattern; import static io.airlift.units.Preconditions.checkArgument; +import static java.lang.Math.floor; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static java.util.concurrent.TimeUnit.DAYS; @@ -130,6 +131,28 @@ public Duration convertToMostSuccinctTimeUnit() return convertTo(unitToUse); } + public java.time.Duration toJavaTime() + { + long seconds; + long nanoAdjustment; + long secondsPerUnit = SECONDS.convert(1, unit); + long nanosPerUnit = NANOSECONDS.convert(1, unit); + if (secondsPerUnit > 1) { + seconds = (long) floor(value * secondsPerUnit); + nanoAdjustment = (long) floor((value - (double) seconds / secondsPerUnit) * nanosPerUnit); + } + else { + long unitsPerSecond = unit.convert(1, SECONDS); + seconds = (long) floor(value / unitsPerSecond); + nanoAdjustment = (long) floor((value - (double) seconds * unitsPerSecond) * nanosPerUnit); + } + + if (seconds == Long.MAX_VALUE) { + nanoAdjustment = 0; + } + return java.time.Duration.ofSeconds(seconds, nanoAdjustment); + } + @JsonValue @Override public String toString() diff --git a/src/test/java/io/airlift/units/TestDuration.java b/src/test/java/io/airlift/units/TestDuration.java index 52e26d5..3f81101 100644 --- a/src/test/java/io/airlift/units/TestDuration.java +++ b/src/test/java/io/airlift/units/TestDuration.java @@ -105,6 +105,82 @@ public void testEquivalence() .check(); } + @Test + public void testToJavaTime() + { + assertThat(new Duration(0, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ZERO); + + assertThat(new Duration(1, NANOSECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(1)); + assertThat(new Duration(1, MICROSECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(1000)); + assertThat(new Duration(1, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofMillis(1)); + assertThat(new Duration(1, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(1)); + assertThat(new Duration(1, MINUTES).toJavaTime()) + .isEqualTo(java.time.Duration.ofMinutes(1)); + assertThat(new Duration(1, HOURS).toJavaTime()) + .isEqualTo(java.time.Duration.ofHours(1)); + assertThat(new Duration(1, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofDays(1)); + + assertThat(new Duration(42, NANOSECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(42)); + assertThat(new Duration(42, MICROSECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(42000)); + assertThat(new Duration(42, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofMillis(42)); + assertThat(new Duration(42, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(42)); + assertThat(new Duration(42, MINUTES).toJavaTime()) + .isEqualTo(java.time.Duration.ofMinutes(42)); + assertThat(new Duration(42, HOURS).toJavaTime()) + .isEqualTo(java.time.Duration.ofHours(42)); + assertThat(new Duration(42, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofDays(42)); + + assertThat(new Duration(123456789, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofMillis(123456789)); + assertThat(new Duration(123456789, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(123456789)); + assertThat(new Duration(123456789, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofDays(123456789)); + + assertThat(new Duration(1234567890123456789d, MILLISECONDS).toJavaTime()) + .isBetween( + java.time.Duration.ofMillis(1234567890123456700L), + java.time.Duration.ofMillis(1234567890123456800L)); + assertThat(new Duration(1234567890123456789d, SECONDS).toJavaTime()) + .isBetween( + java.time.Duration.ofSeconds(1234567890123456700L), + java.time.Duration.ofSeconds(1234567890123456800L)); + assertThat(new Duration(1234567890123456789d, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(Long.MAX_VALUE)); + + assertThat(new Duration(0.01, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(10_000)); + assertThat(new Duration(0.01, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofMillis(10)); + assertThat(new Duration(0.01, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(86400 / 100)); + + assertThat(new Duration(0.25, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(250_000)); + assertThat(new Duration(0.25, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(250_000_000)); + assertThat(new Duration(0.25, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(86400 / 4)); + + assertThat(new Duration(0.5, MILLISECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(500_000)); + assertThat(new Duration(0.5, SECONDS).toJavaTime()) + .isEqualTo(java.time.Duration.ofNanos(500_000_000)); + assertThat(new Duration(0.5, DAYS).toJavaTime()) + .isEqualTo(java.time.Duration.ofSeconds(86400 / 2)); + } + private static List generateTimeBucket(double seconds) { List bucket = new ArrayList<>();