【问题标题】:LocalDateTime and date in DB is not rounded the same数据库中的 LocalDateTime 和日期不四舍五入
【发布时间】:2020-08-04 14:34:32
【问题描述】:

我想用创建用户后收到的LocalDateTime 签署 jwt 令牌。之后,我需要检查 jwt 是否有效,并且通过从 DB 检索到的日期来实现。

问题是LocalDateTime在创建时包含纳秒,而数据库中的日期没有,然后验证失败。

我尝试通过格式化LocalDateTime 来解决这个问题,以显示没有纳秒的日期,但还有另一个问题。 LocalDateTime 被四舍五入到底(例如 1.222 为 1,1.777 为 1)并且插入 DB 的日期被四舍五入,如 1.222 为 1,1.777 为 2,因此验证再次失败。

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

那么有没有更好的解决方案?我可以以某种方式将 LocalDateTime 舍入与 DB 中相同(并将 db 字段类型保留为 DATETIME 而不是 TIMESTAMP)还是可以将 DB 日期舍入为 LocalDateTime

我使用的是 Spring Boot 2.2.4

【问题讨论】:

  • 哪个数据库提供商?
  • 您能否向我们展示您是如何尝试round LocalDateTime 的,甚至可能是您如何解析它或使用如何创建它的?
  • 我刚刚发现我可以添加DATETIME(3),这将在数据库中存储毫秒,这样我就可以避免数据库舍入并保留DATETIME 字段类型。您如何看待这种方法?
  • 我在这个link上找到了LocalDateTIme的四舍五入
  • @CodeScale mysql

标签: java spring-boot localdate


【解决方案1】:

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

  1. 你说

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

    可以这样做:

        yourLocalTime = yourLocalTime.truncatedTo(ChronoUnit.SECONDS);
    

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

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

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

链接: 维基百科文章:Rounding

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2021-12-16
    • 2023-02-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多