Why date parsing using DateTimeFormatter gives different result depending on Java version(为什么使用DateTimeForMatter进行日期解析会根据Java版本不同而产生不同的结果)
问题描述
相同的日期分析代码显示不同的结果,具体取决于我使用的是Java 8还是Java 11。
以下是重现该问题的代码示例:
public static void main(String[] args) {
DateTimeFormatterBuilder dfBuilder = new DateTimeFormatterBuilder()
.appendPattern("uuuu-M-d")
.optionalStart()
.optionalStart().appendLiteral(' ').optionalEnd()
.optionalStart().appendLiteral('T').optionalEnd()
.appendValue(ChronoField.HOUR_OF_DAY)
.optionalStart()
.appendLiteral(':')
.appendValue(ChronoField.MINUTE_OF_HOUR)
.optionalStart()
.appendLiteral(':')
.appendValue(ChronoField.SECOND_OF_MINUTE)
.optionalStart()
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
.optionalEnd()
.optionalEnd()
.optionalEnd()
.appendPattern("[XXXXX][XXXX][XXX][XX][X]")
.optionalEnd();
DateTimeFormatter df = dfBuilder.toFormatter(Locale.FRANCE).withZone(ZoneId.of("Europe/Paris"));
TemporalAccessor temporalAccessor = df.parse("1970-01-01T00:00:00.00Z");
Instant instantTime = Instant.from(temporalAccessor);
long epochTimestamp = instantTime.getEpochSecond();
System.out.println(epochTimestamp);
}
在Java 8上,输出为-3600。
而在Java 11上,输出为0(这是我预期的值)。
根据我的分析,其来源是使用";with Zone()";方法,如果我删除它,它对于包含区域数据的日期将按预期工作。
但同样,此行为在所有DateTimeForMatter上并不相同:例如,如果我使用此格式化程序:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.optionalStart()
.appendZoneId()
.optionalEnd()
.toFormatter()
.withZone(ZoneId.of("Europe/Paris"));
在日期内出现的情况下会很好地考虑zoneID(尽管调用了";with Zone())。 因此,我认为第一个格式化程序有问题,Java 11上的默认行为有助于它在Java 11上按预期工作,但在Java 8上不能。 我还明确表示,我的目标是让它在Java 8上运行。
推荐答案
已知错误
这是Java 8中的已知错误。Parsing with DateTimeFormatter.withZone does not behave as described in javadocs。
有趣的是,我链接到的Java Bugs系统中的错误报告没有提到修复版本。它确实提到了该错误不是在JDK 9-EA中出现的:要重现该问题,请运行附加的测试用例。它在JDK上失败 8u121,但在JDK 9-EA中通过。
这篇关于为什么使用DateTimeForMatter进行日期解析会根据Java版本不同而产生不同的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么使用DateTimeForMatter进行日期解析会根据Java版本不同而产生不同的结果
基础教程推荐
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 降序排序:Java Map 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01