java - 迁移到 Java 8 日期时间
问题描述
我正在更改我们现有SimpleDateFormat
的基于代码以使用新的 Java 8LocalDateTime
和ZonedDateTime
类。
我找不到转换这件作品的简单方法。
考虑样本日期和格式。
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());
有人可以围绕这个用例分享一些指示吗?
解决方案
推荐阅读
- sql - SQL Aggregation with rolling window
- sql - Are there ways to do something like "case when value in table" in AS400 DB2 SQL?
- python - R-Shiny 调试模式
- python - Aggregate dataframe across multiple columns
- javascript - 在 TypeScript 和 MongoDB 中仅获取没有时间的日期
- python - 使用 groupby 和 mean 后绘图需要时间
- flutter - 如何让 SliverPersistentHeader 长满?
- winforms - 如何更改 devexpress gridview 上显示的行数?
- java - 嵌入式 JavaFX、注入视图和 Dagger 2
- javascript - 在 React 中,返回的方法无法读取未定义的属性“目标”