java - LocalDateTime 和数据库中的日期未舍入相同

标签 java spring-boot localdate

我想使用创建用户后收到的 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

最佳答案

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

  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) 是一个非常很好的解决方案。

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

链接:维基百科文章:Rounding

关于java - LocalDateTime 和数据库中的日期未舍入相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61350444/

相关文章:

java - 在构建 jar 并运行该 jar 时,外部依赖包的 @ComponentScan 在 2.1.x 中不起作用

java - 如何转换 dd/MM/yyyy HH :mm:ss to offsetdatetime - java

java - 如何设置 get CreatedAt(); android textview 中的日期对象?

JavaVM Windows 7 64 位 - JFileChooser() 不显示对话框

java - Spring Boot Controller 路径扩展了另一条路径

java - 使用 Post @Consumes(MediaType.ApplicationJson) 隐式解析 LocalDate

java - 如何检查一个日期期间是否与另一个日期期间重叠

java - 在没有 HotSpotDiagnosticMXBean 的情况下从应用程序内部创建堆转储

java - @Resource 在 Spring 中不起作用?

spring-boot - 如何在 JoinFaces/Spring Boot 中设置 Undertow 属性?