从数据库加载后不同格式的Java Date toString

标签 java mysql date

如何在 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. 比较持久对象日期的最佳做法是什么 从一个对象加载之前和之后在对象之间进行单元测试 数据库?

最佳答案

使用对象,而不是字符串

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

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

不要使用遗留的日期时间类,例如 java.util.Date,因为它们非常麻烦、令人困惑且存在缺陷。现在是旧版,被 java.time 取代类。

How does the Date object know which format to pick when using toString?

toString 使用的格式是硬编码的,不是挑选出来的。您总是从该方法中获得相同的格式。格式选择不当,而现代图书馆和协议(protocol)使用标准 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();

How can I control for the new Date object that it shall represent a date only (that is, a day without the time fraction) in the first place?

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

What is the best practice to compare dates of persisted objects in unit tests between an object before and after loading it from a database ?

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

这在 Stack Exchange 上已经被覆盖多次。请搜索类名,例如 LocalDateInstantOffsetDateTimeZonedDateTimeZoneIdjava.sql.Timestamp

关于从数据库加载后不同格式的Java Date toString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42021074/

相关文章:

php - 将当前日期插入表中

java - Google Cloud Bigtable 实例

java - 更顺畅地检查多个状态的属性

java - 将带有 case 子句的 Sql 转换为 Hql

MySQL 不允许我向表中添加外键。没有错误信息

mysql - NodeJS 中的 SQL Promise 返回空括号,但是当在 SQL Workbench 中执行相同的查询时,它返回正确的数据

r - 在R中将字符串转换为日期

java - 使用 gson 获取正确的 JSON 字符串

java - 如何在awt中填充整个窗口

python - 在数据框中保留连续的天数