我在编写一个测试用例时遇到了这个问题,我必须在一系列时间戳之间获取一系列记录——使用H2
嵌入式数据库和spring-data-jpa
.
原始问题位于:Fetching records BETWEEN two java.time.Instant instances in Spring Data Query
我有时间戳作为java.time.Instant
实例。
如果用户没有给出开始结束时间戳,我会继续插入Instant.MIN
和Instant.MAX
。
令我困惑的是,以下测试用例通过了:
@Test
public void test_date_min_max_instants_timestamps() {
Timestamp past = new Timestamp(Long.MIN_VALUE);
Timestamp future = new Timestamp(Long.MAX_VALUE);
Timestamp present = Timestamp.from(Instant.now());
assertTrue(present.after(past));
assertTrue(future.after(past));
assertTrue(future.after(present));
assertTrue(present.before(future));
assertTrue(past.before(present));
assertTrue(past.before(future));
}
但是,以下测试用例失败:
@Test
public void test_instant_ranges() throws InterruptedException {
Timestamp past = Timestamp.from(Instant.MIN);
Timestamp future = Timestamp.from(Instant.MAX);
Timestamp present = Timestamp.from(Instant.now());
assertTrue(present.after(past));
assertTrue(future.after(past));
assertTrue(future.after(present));
assertTrue(present.before(future));
assertTrue(past.before(present));
assertTrue(past.before(future));
}
此外,如果past
和future
不是 MIN/MAX 值,而是正常值,则结果符合预期。
知道为什么 java.sql.Timestamp 会这样吗?
另外,如果 Instant 表示的时间对于 Timestamp 来说太大了,它不应该失败吗?
PS如果这个问题已经被问过,有人可以链接原件,因为我找不到它。
编辑:添加了我在评论部分提到的调试信息,以便我们将所有内容集中在一个地方。
对于由andTimestamp
制成的实例,我有以下值:Instant.MIN
Instant.MAX
past = 169108098-07-03 21:51:43.0
future = 169104627-12-11 11:08:15.999999999
present = 2018-07-23 10:46:50.842
对于由andTimestamp
制成的实例,我得到了:Long.MIN_VALUE
Long.MAX_VALUE
past = 292278994-08-16 23:12:55.192
future = 292278994-08-16 23:12:55.807
present = 2018-07-23 10:49:54.281
为了澄清我的问题,时间戳应该明确失败,而不是静默失败或在内部使用不同的值。目前没有。