使用对象,而不是字符串
不要使用字符串将数据传入/传出数据库。使用对象。这就是JDBC 的目的,将数据库的数据类型转换为Java 的数据类型(类)。
使用 java.time,而不是遗留类
不要使用旧的日期时间类,例如 java.util.Date,因为它们是出了名的麻烦、混乱和有缺陷的。现在是遗留的,被java.time 类所取代。
使用 toString 时,Date 对象如何知道选择哪种格式?
toString 使用的格式是硬编码的,不是选择的。您总是从该方法中获得相同的格式。并且格式选择不佳,而现代库和协议使用标准 ISO 8601 格式。
java.time.Date 中许多糟糕的设计选择之一是 toString 方法的行为,该方法将 JVM 的当前默认时区应用于实际为 UTC 的值。这会造成时区实际上并不存在的错觉。
最好避免使用这些字符串。在 Java 和数据库之间传递和获取对象而不是字符串。调用 PreparedStatement::setObject 和 ResultSet::getObject 方法以使用 LocalDate、Instant 和其他此类 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 类提供了比较方法,例如compareTo、isAfter、isBefore 和isEqual。其他类类似。
这一切都在 Stack Exchange 上多次 讨论过了。请搜索类名称,例如LocalDate、Instant、OffsetDateTime、ZonedDateTime、ZoneId 和 java.sql.Timestamp。