diff --git a/debezium-core/src/main/java/io/debezium/time/NanoDuration.java b/debezium-core/src/main/java/io/debezium/time/NanoDuration.java index 3d9ea8dc3..27cda34b2 100644 --- a/debezium-core/src/main/java/io/debezium/time/NanoDuration.java +++ b/debezium-core/src/main/java/io/debezium/time/NanoDuration.java @@ -6,8 +6,8 @@ package io.debezium.time; -import java.math.BigDecimal; import java.time.temporal.ChronoUnit; + import org.apache.kafka.connect.data.Schema; import org.apache.kafka.connect.data.SchemaBuilder; @@ -61,13 +61,13 @@ private NanoDuration() { * @param minutes a number of minutes * @param seconds a number of seconds * @param nanos a number of nanoseconds - * @return a {@link BigDecimal} value which contains the number of nanoseconds, never {@code null} + * @return Approximate representation of the given interval as a number of nanoseconds */ - public static double durationNanos(int years, int months, int days, int hours, int minutes, double seconds, long nanos) { + public static long durationNanos(int years, int months, int days, int hours, int minutes, long seconds, long nanos) { long daysPerMonthAvg = ChronoUnit.MONTHS.getDuration().toDays(); - double numberOfDays = ((years * 12) + months) * daysPerMonthAvg + days; - double numberOfSeconds = (((numberOfDays * 24 + hours) * 60) + minutes) * 60 + seconds; - return numberOfSeconds * 1e9 + nanos; + long numberOfDays = ((years * 12) + months) * daysPerMonthAvg + days; + long numberOfSeconds = (((numberOfDays * 24 + hours) * 60) + minutes) * 60 + seconds; + return numberOfSeconds * ChronoUnit.SECONDS.getDuration().toNanos() + nanos; } /** @@ -79,10 +79,9 @@ public static double durationNanos(int years, int months, int days, int hours, i * @param hours a number of hours * @param minutes a number of minutes * @param seconds a number of seconds - * from {@link ChronoUnit#MONTHS} is used. - * @return a {@link BigDecimal} value which contains the number of nanoseconds, never {@code null} + * @return Approximate representation of the given interval as a number of nanoseconds */ - public static double durationNanos(int years, int months, int days, int hours, int minutes, double seconds) { + public static long durationNanos(int years, int months, int days, int hours, int minutes, long seconds) { return durationNanos(years, months, days, hours, minutes, seconds, 0); } } diff --git a/debezium-core/src/test/java/io/debezium/time/NanoDurationTest.java b/debezium-core/src/test/java/io/debezium/time/NanoDurationTest.java new file mode 100644 index 000000000..643e1d0c5 --- /dev/null +++ b/debezium-core/src/test/java/io/debezium/time/NanoDurationTest.java @@ -0,0 +1,31 @@ +/* + * Copyright Debezium Authors. + * + * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package io.debezium.time; + +import static org.fest.assertions.Assertions.assertThat; + +import java.time.temporal.ChronoUnit; + +import org.junit.Test; + +import io.debezium.doc.FixFor; + +public class NanoDurationTest { + + @Test + @FixFor("DBZ-1405") + public void testNanoDuration() { + long years = 6 * 12 * 30 * ChronoUnit.DAYS.getDuration().toNanos(); + long months = 7 * 30 * ChronoUnit.DAYS.getDuration().toNanos(); + long days = 1 * ChronoUnit.DAYS.getDuration().toNanos(); + long hours = 2 * ChronoUnit.HOURS.getDuration().toNanos(); + long minutes = 3 * ChronoUnit.MINUTES.getDuration().toNanos(); + long seconds = 4 * ChronoUnit.SECONDS.getDuration().toNanos(); + long nanos = 5; + + assertThat(NanoDuration.durationNanos(6, 7, 1, 2, 3, 4, 5)).isEqualTo(years + months + days + hours + minutes + seconds + nanos); + } +}