我知道经过 3 年的软件开发后这可能听起来很尴尬,但我正在尝试更好地理解 java.time 类以及如何使用它们来避免错误和不良实践。
在我参与的第一个项目中,使用的 java 版本是 8,但日期值存储在遗留类 java.util.Date 上
两年后,新公司、新项目使用 java 版本 17,但日期值仍然存储在遗留类 java.util.Date 中
当我看到项目上有一个 DateUtils ,其方法如下:
public static String toString_ddMMyyyy_dotted(Date date){
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefualt()).toLocalDateTime();
DateTimeFormatter.ofPattern("dd.MM.yyyy").format(localDateTime);
}
public static Date getBeginOfTheYear(Date date){
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefualt()).toLocalDate();
LocalDate beginOfTheYear = localDate.withMonth(1).withDayOfMonth(1);
return Date.from(beginOfTheYear.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
所以我的问题是,为什么不直接使用具有非常好的 API 的 java.time 类,而不是在需要对日期进行操作时将变量转换为 LocalDate/LocalDateTime ?
我们的想法是尽快重构项目,将 Date/DateTime/Time 值存储到 java.time 类中。我从一个简单的模块开始,它将一些数据保存到 MongoDB 中。我应用了以下字段类型转换:
- 将日期值转换为 LocalDate
- 日期和时间值转换为 LocalDateTime
在测试过程中我立即发现一个问题,值为 2023-10-07 12:00:00 的 localDateTime 变量在 MongoDB 上保存为 2023-10-07 10:00:00 只要当数据被取回到java中,该值又回到了2023-10-07 12:00:00,但是这并没有发生,所以这是一个大问题。
首先,这种情况是仅在使用LocalDateTime时发生,还是在使用LocalDate时也会发生?
在实体/文档类上存储日期/日期时间值的最佳实践是什么?我应该使用 ZonedDateTime 而不是 LocalDateTime 吗?