DB 中的 LocalDateTime 和日期四舍五入不一样

LocalDateTime and date in DB is not rounded the same

我想用创建用户后收到的 LocalDateTime 签署 jwt 令牌。之后,我需要检查 jwt 是否有效,我正在通过从数据库检索的日期来实现这一点。

问题是 LocalDateTime 创建时包含纳秒,而来自数据库的日期不包含,然后验证失败。

我尝试通过格式化 LocalDateTime 来解决这个问题,以显示没有纳秒的日期,但还有另一个问题。 LocalDateTime 四舍五入到下限(例如 1.222 是 1,1.777 是 1)并且插入数据库的日期像这样四舍五入 1.222 是 1,1.777 是 2,所以验证再次失败。

我设法通过在我的实体字段上添加 @Column(columnDefinition = "TIMESTAMP (6)") 来解决这个问题,现在纳秒也存储在数据库中,一切正常,但我不确定这是正确的解决方案。

那么有没有更好的解决办法呢?我能否以某种方式将 LocalDateTime 舍入为与 DB 相同(并将数据库字段类型保留为 DATETIME 而不是 TIMESTAMP)或者数据库日期是否可以舍入为 LocalDateTime.

我正在使用 spring boot 2.2.4

我相信评论中已经回答了这个问题。所以为了让大家明白这一点,我想总结一下讨论的解决方案。

  1. 你说

    truncate the LocalDateTime before saving it to the database is probably the best solution, because I do not need milliseconds to be stored.

    可以这样做:

        yourLocalTime = yourLocalTime.truncatedTo(ChronoUnit.SECONDS);
    

    这可确保值落在整秒内。没有进一步的截断或舍入发生。因此,从这一点来看,价值观是一致的。

  2. 在我看来,正如您在问题中提到的那样,在数据库中使用 TIMESTAMP(6) 是一个非常 好的解决方案。

我认为您不想尝试模仿数据库舍入值的方式。这将需要大量测试来验证您在所有极端情况下是否以完全相同的方式进行操作。我们可能不知道数据库是否使用“四舍五入”、“四舍五入”或其他一些四舍五入。我们甚至可能不确定它是否会在下一版本的数据库引擎中发生变化。

Link: 维基百科文章:Rounding