【问题标题】:Java Date toString in different format after loaded from database从数据库加载后不同格式的Java Date toString
【发布时间】:2017-06-20 15:18:05
【问题描述】:

如何在 Java 中以可靠的方式比较日期在它们被持久化之前和之后? 我面临的问题是:当我创建 java.util.Date 的新实例时,它的 toString() 方法返回一个值,包括星期几和时区:

Fri Feb 03 10:15:31 CET 2017

当我将此日期(编辑:Date 对象)保存在数据库表中并将其加载回实体时,toString 方法会返回不同的格式,具体取决于数据库类型:

In case of MySQL date: 2017-02-03
In case of MySQL datetime: 2017-02-03 10:24:34.0

我并不总是可以访问格式化程序,因为 toString 方法可能会被我的应用程序中的另一个 toString 方法隐式调用。

这些问题出现在我身上:

  1. Date 对象如何知道在使用时选择哪种格式 字符串?
  2. 如何控制新的 Date 对象 首先只表示一个日期(即没有时间分数的一天)?
  3. 比较持久对象日期的最佳做法是什么? 在从一个对象加载它之前和之后在一个对象之间进行单元测试 数据库?

【问题讨论】:

    标签: java mysql date


    【解决方案1】:

    使用对象,而不是字符串

    不要使用字符串将数据传入/传出数据库。使用对象。这就是JDBC 的目的,将数据库的数据类型转换为Java 的数据类型(类)。

    使用 java.time,而不是遗留类

    不要使用旧的日期时间类,例如 java.util.Date,因为它们是出了名的麻烦、混乱和有缺陷的。现在是遗留的,被java.time 类所取代。

    使用 toString 时,Date 对象如何知道选择哪种格式?

    toString 使用的格式是硬编码的,不是选择的。您总是从该方法中获得相同的格式。并且格式选择不佳,而现代库和协议使用标准 ISO 8601 格式。

    java.time.Date 中许多糟糕的设计选择之一是 toString 方法的行为,该方法将 JVM 的当前默认时区应用于实际为 UTC 的值。这会造成时区实际上并不存在的错觉。

    最好避免使用这些字符串。在 Java 和数据库之间传递和获取对象而不是字符串。调用 PreparedStatement::setObjectResultSet::getObject 方法以使用 LocalDateInstant 和其他此类 java.time 对象。

    LocalDate ld = myResultSet.getObject( … );
    

    如果您的JDBC driver 尚未与JDBC 4.2 兼容,并且无法直接处理 java.time 对象,请退回到简要使用 java.sql 类型。通过调用添加到旧类的新方法,立即将这些 java.sql 对象转换为 java.time 对象。

    java.sql.Date myJavaSqlDate = myResultSet.getDate( … );
    java.time.LocalDate ld = myJavaSqlDate.toLocalDate();
    

    我如何才能控制新的 Date 对象首先只表示一个日期(即没有时间分数的一天)?

    使用LocalDate 类作为没有时间和时区的仅日期值。这映射到等效于 SQL 标准 DATE 类型。您应该使用仅日期类型来定义数据库中的列。

    在从数据库加载对象之前和之后比较单元测试中持久对象的日期的最佳做法是什么?

    LocalDate 类提供了比较方法,例如compareToisAfterisBeforeisEqual。其他类类似。

    这一切都在 Stack Exchange 上多次 讨论过了。请搜索类名称,例如LocalDateInstantOffsetDateTimeZonedDateTimeZoneIdjava.sql.Timestamp

    【讨论】:

    • 我不使用字符串来保存日期,我确实保存了 Date 对象。我编辑了我的帖子以使其更清晰。你在不同的地方使用 toString 方法,比如在你的 IDE 中调试时,结果对我来说有点神奇。现在我有了更好的理解。并感谢您提示我将 JDBC Sql Date 转换为 Java 8 LocalDate。看来我的老司机不支持它。当前的可以,我会使用它!
    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多