我想使用创建用户后收到的 LocalDateTime
签署 jwt token 。之后,我需要检查 jwt 是否有效,并且我通过从数据库检索的日期来实现这一点。
问题是创建时的 LocalDateTime
包含纳秒,而数据库中的日期不包含纳秒,然后验证失败。
我尝试通过设置 LocalDateTime
格式来显示不带纳秒的日期来解决此问题,但还有另一个问题。 LocalDateTime
四舍五入到下限(例如 1.222 是 1,1.777 是 1),并且插入数据库中的日期四舍五入,就像这样 1.222 是 1,1.777 是 2,因此验证再次失败。
我设法通过在实体中的字段上添加 @Column(columnDefinition = "TIMESTAMP (6)")
来解决此问题,现在纳秒也存储在数据库中,并且一切正常,但我'我不确定这是否是正确的解决方案。
那么有没有更好的解决办法呢?我可以以某种方式舍入 LocalDateTime
与数据库中相同(并将数据库字段类型保留为 DATETIME
而不是 TIMESTAMP
),或者数据库日期可以舍入为 LocalDateTime
.
我使用的是 Spring Boot 2.2.4
最佳答案
我相信这个问题已经在评论中得到了解答。所以为了让大家清楚这一点,我想总结一下讨论的解决方案。
你说
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);
这可以确保这些值落在整秒上。不会发生进一步的截断或舍入。因此,从这一点来看,这些值是一致的。
我认为,正如您在问题中提到的那样,在数据库中使用
TIMESTAMP(6)
是一个非常很好的解决方案。
我认为您不会想要尝试模仿数据库舍入值的方式。这需要大量的测试来验证您是否在所有极端情况下都以完全相同的方式进行操作。我们可能不知道数据库是否使用“四舍五入”、“向上舍入”或其他某种舍入。我们甚至可能不确定它在下一版本的数据库引擎中是否会发生变化。
链接:维基百科文章:Rounding
关于java - LocalDateTime 和数据库中的日期未舍入相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61350444/