Java Instant 和 Postgres TIMESTAMPTZ 之间有 3 位数字的差异

Mar*_*vic 2 java postgresql assertj spring-data-jdbc

给定 Java 中的以下字段:

private Instant createdDate = Instant.now();
Run Code Online (Sandbox Code Playgroud)

对应Postgres中的以下字段:

created_date TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

并使用 Spring Data JDBC CrudRepository save(S实体)保存到数据库。

检查原始对象字段和保存的对象字段是否相等时:

assertThat(original_obj.getCreatedDate()).isEqualTo(database_obj.getCreatedDate());
Run Code Online (Sandbox Code Playgroud)

我得到以下不匹配:

org.opentest4j.AssertionFailedError:
      expected: 2023-05-29T10:41:12.555839137Z
       but was: 2023-05-29T10:41:12.555839Z
Run Code Online (Sandbox Code Playgroud)

看起来Instant从数据库加载的数字比原始 Instant 少了 3 位。

我怎样才能使两个时刻匹配?为什么它们不同?

Sta*_*sev 5

Java Time 存储时间的精度高达 1纳秒,而 Postgres 存储微秒

您可以按照评论中的建议允许比较中的增量,或者..如果您不关心这些纳秒,更简单的解决方案是截断 Java 中的日期:

Instant createdDate = Instant.now().truncatedTo(ChronoUnit.MICROS)
Run Code Online (Sandbox Code Playgroud)