DateTimeFormatter
类文档说明了其年份的格式代码:
没有其他提及“时代”。
那么,这两个代码u
与y
和year
与year-of-era
有什么区别?
在Java中使用日期时,何时应使用这种模式uuuu-MM-dd
和yyyy-MM-dd
?
似乎那些由知识渊博的人编写的示例代码使用uuuu
,但是为什么呢?
其他格式类(例如旧版 SimpleDateFormat
)仅包含yyyy
,因此我很困惑为什么java.time将此uuuu
带入了“时代”。
最佳答案
在java.time
-package的范围内,我们可以说:
DateTimeFormatter
否则将坚持使用与“y”(=年)组合的时代。因此,使用“u”将避免在严格的格式/解析中出现一些可能的意外异常。另请参见SO-post。与“y”相比,用“u”符号改进的另一个小问题是打印/解析负格里高利历年(很久以前)。SimpleDateFormat
自Java以来就将“u”用于其他目的-7(ISO-day-number-of-week)。困惑得到了保证-永远吗?背景资料:
在开发和集成JSR 310(
java.time
-packages)时,设计人员决定使用Common Locale Data Repository (CLDR) / LDML-spec作为DateTimeFormatter
中的模式符号的基础。 CLDR中已经将符号“u”定义为公历公历年份,因此此含义已用于新的即将发布的JSR-310(但由于向后兼容的原因而未用于SimpleDateFormat
)。但是,遵循CLDR的决定并不一致,因为JSR-310还引入了CLDR中不存在,仍然不存在的新模式符号,另请参见此旧CLDR-ticket。建议的符号“I”被CLDR更改为“VV”,并最终被JSR-310取代,包括new symbols "x" and "X"。但是CLDR中仍然不存在“n”和“N”,并且由于该旧凭单已关闭,因此尚不清楚CLDR是否会支持JSR-310。此外,票证没有提及符号“p”(JSR-310中的填充指令,但未在CLDR中定义)。 因此,在跨不同库和语言的模式定义之间,我们仍未达成完美的协议(protocol)。
关于“y”:我们也不应忽略以下事实:CLDR将这一年份与至少某种混合的朱利安/格里高利安年份联系在一起,而不是像JSR-310那样与多义的格里高利年份联系在一起(排除负数年)。因此,CLDR和JSR-310之间也没有完美的协议(protocol)。