我想用创建用户后收到的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
我相信评论中已经回答了这个问题。因此,为了让所有人都清楚,我想总结一下讨论的解决方案。
您说过
截断LocalDateTime之前将其保存到数据库中是可能是最好的解决方案,因为我不需要毫秒已存储。
可以这样做:
yourLocalTime = yourLocalTime.truncatedTo(ChronoUnit.SECONDS);
这可确保值落在整秒上。不会进一步截断或舍入。因此,从这一点来看,这些值是一致的。
我认为您在问题中提到的在数据库中使用TIMESTAMP(6)
是一个[[非常不错的解决方案。
Link:维基百科文章:Rounding