diff --git a/table/src/main/java/tech/ydb/table/values/PrimitiveValue.java b/table/src/main/java/tech/ydb/table/values/PrimitiveValue.java index c92882b3..0caff1c2 100644 --- a/table/src/main/java/tech/ydb/table/values/PrimitiveValue.java +++ b/table/src/main/java/tech/ydb/table/values/PrimitiveValue.java @@ -291,14 +291,18 @@ public static PrimitiveValue newDatetime(LocalDateTime value) { public static PrimitiveValue newTimestamp(long microsSinceEpoch) { if (microsSinceEpoch < 0) { - throw new IllegalArgumentException("negative microsSinceEpoch: " + microsSinceEpoch); + throw new IllegalArgumentException("Negative microsSinceEpoch: " + microsSinceEpoch); } return new InstantValue(PrimitiveType.Timestamp, microsSinceEpoch); } public static PrimitiveValue newTimestamp(Instant value) { - long micros = TimeUnit.SECONDS.toMicros(value.getEpochSecond()) + - TimeUnit.NANOSECONDS.toMicros(value.getNano()); + long seconds = value.getEpochSecond(); + if (seconds < 0) { + throw new IllegalArgumentException("Instant before epoch: " + value); + } + int nanos = value.getNano(); + long micros = seconds * 1000000L + nanos / 1000; return new InstantValue(PrimitiveType.Timestamp, micros); } diff --git a/table/src/test/java/tech/ydb/table/types/PrimitiveTypeTest.java b/table/src/test/java/tech/ydb/table/types/PrimitiveTypeTest.java index 34bc0627..5e1e0806 100644 --- a/table/src/test/java/tech/ydb/table/types/PrimitiveTypeTest.java +++ b/table/src/test/java/tech/ydb/table/types/PrimitiveTypeTest.java @@ -17,6 +17,7 @@ public class PrimitiveTypeTest { @Test public void timestampTest() { PrimitiveValue min = PrimitiveValue.newTimestamp(Instant.EPOCH); + Assert.assertEquals(min, PrimitiveValue.newTimestamp(0)); Value minValue = min.toPb(); Assert.assertEquals(0, minValue.getUint32Value()); @@ -27,6 +28,7 @@ public void timestampTest() { Assert.assertEquals(0, minValue.getHigh128()); PrimitiveValue max = PrimitiveValue.newTimestamp(Instant.parse("2105-12-31T23:59:59.999999Z")); + Assert.assertEquals(max, PrimitiveValue.newTimestamp(4291747199999999l)); Value maxValue = max.toPb(); Assert.assertEquals(0, maxValue.getUint32Value()); @@ -35,5 +37,15 @@ public void timestampTest() { Assert.assertEquals(0, maxValue.getInt64Value()); Assert.assertEquals(0, maxValue.getLow128()); Assert.assertEquals(0, maxValue.getHigh128()); + + IllegalArgumentException err1 = Assert.assertThrows( + IllegalArgumentException.class, () -> PrimitiveValue.newTimestamp(-1) + ); + Assert.assertEquals("Negative microsSinceEpoch: -1", err1.getMessage()); + + IllegalArgumentException err2 = Assert.assertThrows( + IllegalArgumentException.class, () -> PrimitiveValue.newTimestamp(Instant.EPOCH.minusNanos(1)) + ); + Assert.assertEquals("Instant before epoch: 1969-12-31T23:59:59.999999999Z", err2.getMessage()); } }