Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat:不一致的模式字母_Java_Simpledateformat - Fatal编程技术网

Java SimpleDataFormat:不一致的模式字母

Java SimpleDataFormat:不一致的模式字母,java,simpledateformat,Java,Simpledateformat,最近,我查看了文档,发现它们在处理解析字母时存在一些不一致之处(我认为) 例如,请查看以下表示: M: Month in year D: Day in year d: Day in month H: Hour in day (0-23) k: Hour in day (1-24) K: Hour in am/pm (0-11) h: Hour in am/pm (1-12) “年x”的时间跨度比“月x”大,因此有大写字母,所以这对我来说非常有意义 但是还有 w: Week in year W

最近,我查看了文档,发现它们在处理解析字母时存在一些不一致之处(我认为)

例如,请查看以下表示:

M: Month in year
D: Day in year
d: Day in month
H: Hour in day (0-23)
k: Hour in day (1-24)
K: Hour in am/pm (0-11)
h: Hour in am/pm (1-12)
“年x”的时间跨度比“月x”大,因此有大写字母,所以这对我来说非常有意义

但是还有

w: Week in year
W: Week in month
在这里,字母互换,这在我看来完全违反直觉。似乎这两种情况应该相反,以符合上述“模式”

另一个示例是不同的小时表示:

M: Month in year
D: Day in year
d: Day in month
H: Hour in day (0-23)
k: Hour in day (1-24)
K: Hour in am/pm (0-11)
h: Hour in am/pm (1-12)
我有点明白了。大写字母表示从0开始的小时数,小写字母表示从1开始的小时数。 在这里,两个小写字母应该互换,因为相同的字母不应该属于相同的类别吗?(
H/H
表示一天中的小时,
K/K
表示上午/下午的小时)

所以我的问题是:这种看似违反直觉的表现背后有什么原因吗?

我能想到的唯一原因是,其中一些图案字母是在以后添加的,由于向下兼容,它们无法更改现有的图案字母。但除此之外,这对我来说没有多大意义。

引文:

“我能想到的唯一原因是,其中一些模式 后来添加了字母,它们无法更改 已经存在的,因为向下兼容。”

你的怀疑是对的。但你不能(只)为此责怪Sun和Oracle的设计师。他们刚刚超越了Taligent(现已并入IBM)最初的全部功能。IBM本身也是Unicode联盟背后的领先公司之一,Unicode联盟定义了。在该标准中,所有这些图案符号都被定义(事实上是以一种完全不一致的方式——只有历史发展才能解释)

更糟糕的是,CLDR中的不一致并没有停止:最近,除了SHORT、LONG等之外,我们还有一个窄变量。这意味着,如果您希望将月份的shortes可能表示为单个字母,那么您需要指定模式符号MMMMM(5个字母,因为一个字母M已保留用于数字缩写形式)

另一个注意事项:SimpleDataFormat甚至没有严格遵循CLDR。例如,Oracle在Java版本7中将模式符号“u”定义为ISO周天数(1=星期一,…,7=星期日),尽管CLDR早在ISO年开始时就引入了相同的符号。Java8又一次偏离了CLDR,发明了CLDR中未知的新符号,但其他方面则试图更紧密地遵循CLDR


我们在使用模式语言时已经有了显著的差异(比较Java-6、Java-7、Java-8、纯CLDR和Joda Time)。我担心这永远不会停止。

你需要问API的设计师一个非常有趣的答案!所以这个CLDR标准并不是一个严格的标准,因为它每次都有不同的解释。它总是那么令人困惑。