首页 > 解决方案 > 迁移到 Java 8 日期时间

问题描述

我正在更改我们现有SimpleDateFormat的基于代码以使用新的 Java 8LocalDateTimeZonedDateTime类。

我找不到转换这件作品的简单方法。

考虑样本日期和格式。

String testDate = "2012-12-31T10:10:10-06:00";
String testFormat = "yyyy-MM-dd'T'HH:mm:ss";

现有代码,

SimpleDateFormat sdf = new SimpleDateFormat(testFormat);
System.out.println(sdf.parse(testDate));

这件作品适用于包含如上所述的时区偏移的日期值。如果提供,它会忽略时区,并且在这两种情况下都默认为系统时区。

但是,如果我用下面的代码替换它,

DateTimeFormatter df = DateTimeFormatter.ofPattern(testFormat);
LocalDateTime ldt = LocalDateTime.parse(testDate, df);
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
System.out.println(zdt.toString());

上述格式失败。为了让它工作,我必须去掉日期中的时区位,即将其转换为"2012-12-31T10:10:10"或更改格式以包含时区详细信息,即“z”。

因此,至少从我最初的测试来看,新类在将格式与T不同的匹配方面非常严格SimpleDateFormat。我什至尝试标记DateTimeFormater.setLineant(),但这也没有帮助。或者也许还有一些其他类可以在这种情况下工作,只是我不知道它们。

添加更多详细信息,说明为什么我想使用新 API 来拥有旧版行为。在我们的产品中,我们公开了最终客户可以使用的这些 API,因此相关 API 接受字符串中的日期时间值和格式,并使用“SimpleDateFormat”。因此,我希望即使使用新的 API 也能继续现有行为,以便我们继续保持向后兼容性。

目前,我想出的上述示例的唯一解决方案是将其作为例外情况处理,

DateTimeFormatter df = DateTimeFormatter.ofPattern(testFormat);
LocalDateTime ldt = null;
try {
   ldt = LocalDateTime.parse(testDate, df);
} catch (DateTimeParseException dtpException) {
   ldt = ZonedDateTime.parse(testDate).toLocalDateTime();
}
if (ldt != null) zdt = ldt.atZone(ZoneId.systemDefault());

有人可以围绕这个用例分享一些指示吗?

标签: javajava-8formatjava-time

解决方案


推荐阅读