从数据库加载后,Java日期字符串的格式不同

从数据库加载后,Java日期字符串的格式不同,java,mysql,date,Java,Mysql,Date,如何在Java中可靠地比较持久化前后的日期? 我面临的问题是:当我创建java.util.Date的新实例时,它的toString()方法返回一个值,包括星期几和时区: Fri Feb 03 10:15:31 CET 2017 当我将此日期(编辑:日期对象)保留在数据库表中并将其加载回实体时,toString方法将根据数据库类型返回不同的格式: In case of MySQL date: 2017-02-03 In case of MySQL datetime: 2017-02-03 10:

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

Fri Feb 03 10:15:31 CET 2017
当我将此日期(编辑:日期对象)保留在数据库表中并将其加载回实体时,toString方法将根据数据库类型返回不同的格式:

In case of MySQL date: 2017-02-03
In case of MySQL datetime: 2017-02-03 10:24:34.0
我并不总是能够访问格式化程序,因为to-toString方法可能会被我的应用程序中的另一个toString方法隐式调用

我有以下问题:

  • 日期对象如何知道在使用时选择哪种格式 toString
  • 如何控制新日期对象的 首先只表示一个日期(即不含时间分数的一天)
  • 比较中持久化对象的日期的最佳实践是什么 从数据库加载对象之前和之后,在对象之间进行单元测试 数据库
  • 使用对象,而不是字符串 不要使用字符串向数据库传递数据或从数据库传递数据。使用对象。这就是从数据库的数据类型转换为Java的数据类型(类)的目的

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

    java.sql.Date myJavaSqlDate = myResultSet.getDate( … );
    java.time.LocalDate ld = myJavaSqlDate.toLocalDate();
    
    当使用toString时,Date对象如何知道选择哪种格式

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

    java.time.Date
    中有许多糟糕的设计选择,其中之一是
    toString
    方法将JVM的当前默认时区应用于实际使用UTC的值。这就产生了一种时区的错觉,而实际上并不存在

    最好避免使用这些字符串。在Java和数据库之间传递和获取对象,而不是字符串。调用
    PreparedStatement::setObject
    ResultSet::getObject
    方法来处理
    LocalDate
    Instant
    和其他类似的java.time对象

    LocalDate ld = myResultSet.getObject( … );
    
    如果您的应用程序还不符合java.time对象,并且无法直接处理java.time对象,那么可以简单地使用java.sql类型。通过调用添加到旧类中的新方法,立即将这些java.sql对象转换为java.time对象

    java.sql.Date myJavaSqlDate = myResultSet.getDate( … );
    java.time.LocalDate ld = myJavaSqlDate.toLocalDate();
    
    我如何控制新的日期对象,使其首先只表示一个日期(即,没有时间分数的一天)

    将该类用于仅日期的值,该值不包含一天中的时间,也不包含时区。这映射到SQL标准日期类型的等效项。您应该使用仅日期类型来定义数据库中的列

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

    LocalDate
    类提供了比较方法,例如
    compareTo
    isAfter
    isBefore
    isEqual
    。其他类别也类似


    这在Stack Exchange中已经讨论过很多次了。请搜索类名,例如
    LocalDate
    Instant
    OffsetDateTime
    ZonedDateTime
    ZoneId
    ,以及
    java.sql.Timestamp

    我不使用字符串来持久化日期,而是持久化日期对象。我编辑了我的帖子,让它更清晰。你在不同的地方使用toString方法,比如在你的IDE中的dubugging时间,结果对我来说是不可思议的。现在我有了更好的理解。感谢您给我关于将JDBCSQL日期转换为Java8LocalDate的提示。看来我的老司机不支持它。目前的一个,我会使用它!