【问题标题】:Hibernate 5.3, persist java.time.* truncating to microsecondHibernate 5.3,坚持 java.time.* 截断到微秒
【发布时间】:2019-09-30 18:00:15
【问题描述】:

我使用 Spring JPA 和 Hibernate 5.3 创建了一个 Spring Boot 2.x 应用程序。我正在使用 MySql 5.7。由于 My DB 中的 DateTime 列的精度为 6,因此我想在我的应用程序中将日期截断为微秒,然后再将值存储到 DB 中。

事实上,如果我不这样做,当我有一个像 2020-01-31T22:59:59.999999999Z 这样的日期时,在 MySql 中会被持久化为 2020-01-31T23:00:00.000000Z,我当然不想要这个!

我在我的应用程序中使用 java.time.Instant。我正在寻找一种巧妙的方法来为整个应用程序完成此任务。 如果使用自定义 Hibernate 类型或其他东西,我很矛盾。我想要一些提示来指引我正确的方向。

【问题讨论】:

    标签: java spring hibernate java-time


    【解决方案1】:

    截断到()

    当您知道时,这很容易:使用您正在使用的日期时间类的truncatedTo 方法(可能是InstantOffsetDateTime)。例如:

        Instant pointInTime = Instant.parse("2020-01-31T22:59:59.999999999Z");
        System.out.println("Original instant:          " + pointInTime);
        Instant truncated = pointInTime.truncatedTo(ChronoUnit.MICROS);
        System.out.println("Truncated to microseconds: " + truncated);
    

    输出是:

    Original instant:          2020-01-31T22:59:59.999999999Z
    Truncated to microseconds: 2020-01-31T22:59:59.999999Z
    

    不过,它不会在您的应用程序中自动运行。

    链接:Documentation of Instant.truncatedTo

    【讨论】:

    • 感谢您的回复。我确实知道如何在 Java 中截断日期。关键是如何在 Hibernate 将记录持久化到数据库之前自动执行此操作。
    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多