从数据库加载后,Java日期字符串的格式不同
如何在Java中可靠地比较持久化前后的日期? 我面临的问题是:当我创建java.util.Date的新实例时,它的toString()方法返回一个值,包括星期几和时区:从数据库加载后,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:
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方法隐式调用
我有以下问题:
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的提示。看来我的老司机不支持它。目前的一个,我会使用它!