DB中的LocalDateTime和日期未四舍五入

问题描述 投票:0回答:1

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

问题是创建时的LocalDateTime包含纳秒,并且来自DB的日期不包含,因此验证失败。

我尝试通过格式化LocalDateTime来解决此问题,以显示不具有纳秒级的日期,但是还有另一个问题。 LocalDateTime舍入到下限(例如1.222为1,而1.777为1),并且插入数据库中的日期也被舍入为1.222为1,1.777为2,因此验证再次失败。

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

那么还有更好的解决方案吗?我可以以某种方式将LocalDateTime与数据库中的值四舍五入(并将db字段类型保留为DATETIME而不是TIMESTAMP),或者可以将DB日期四舍五入为LocalDateTime

我正在使用Spring Boot 2.2.4

java spring-boot localdate
1个回答
0
投票

我相信评论中已经回答了这个问题。因此,为了让所有人都清楚,我想总结一下讨论的解决方案。

  1. 您说过

    截断LocalDateTime之前将其保存到数据库中是可能是最好的解决方案,因为我不需要毫秒已存储。

    可以这样做:

        yourLocalTime = yourLocalTime.truncatedTo(ChronoUnit.SECONDS);
    

    这可确保值落在整秒上。不会进一步截断或舍入。因此,从这一点来看,这些值是一致的。

  2. 我认为您在问题中提到的在数据库中使用TIMESTAMP(6)是一个[[非常不错的解决方案。

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

Link:维基百科文章:Rounding

© www.soinside.com 2019 - 2024. All rights reserved.