gpt4 book ai didi

java - DateTimeFormatter 与 SimpleDateFormat 不兼容

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:53:23 25 4
gpt4 key购买 nike

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;


public class Test001 {

public static void main(String[] args) {
Date dt = new Date();
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS zzz").withZone(ZoneId.of("America/New_York"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz");

System.out.println(formatter.format(localDateTime));
System.out.println(sdf.format(dt));
}

}

输出

2016-04-19 11:25:34.917 ET
2016-04-19 11:25:34.637 EDT

我笔记本电脑的时区是“美国/纽约”(即美国东部时间/加拿大)。

我想知道如何使用 DateTimeFormatter 获取“EDT”而不是“ET”。
我也想知道:为什么 DateTimeFormatter 在解析/格式模式方面与 SimpleDataFormat 不兼容(如本例所示,它们不兼容)。

最佳答案

您看到的“ET”格式在 Unicode Locale Data Markup Language (LDML) 中称为“通用非位置”格式。您想要的格式“EDT”称为“特定非位置”格式。

DateTimeFormatterBuilder 中的相关源代码会检查日期时间对象是否可以提供 ChronoField.INSTANT_SECONDS。如果可以,则使用“特定非位置”格式,如果不能,则使用“通用非位置”格式。

由于您正在格式化 LocalDateTime ,它不支持访问 ChronoField.INSTANT_SECONDS,因此您将获得“通用非位置”格式。要获得所需的输出,请改用 ZonedDateTimeOffsetDateTime。 (需要瞬间判断是夏令时还是冬令时。)

请注意,SimpleDateFormatDateTimeFormatter 确实不同,假设模式相同是不正确的。已决定将 DateTimeFormatter 与 LDML 规范重新同步,这将在未来带来好处。

这个答案提供了一个解决方案和解释,但我必须指出,这里的 JDK 代码过于苛刻。由于您同时提供了 LocalDateTimeZoneId ,因此代码应该能够做得更好,并即时确定 ChronoField.INSTANT_SECONDS 并因此使用“特定的非-位置”格式。因此,我认为这里存在一个边缘案例 JDK issue

关于java - DateTimeFormatter 与 SimpleDateFormat 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com