SimpleDateFormat中的一些奇异的事情
java.text在java类库中用于格式化,查询和处理文本。
那java.text.SimpleDateFormat 位于java类库 java.text下,用来格式化时间。
我们也经常使用到:
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
的语句来格式化时间。
在SimpleDateFormat中‘H’的大写代表24小时制,而‘h’代表12小时制。
但是在SimpleDateFormat中有一件奇异的事情下来dodo就来谈谈:
dodo写了一段代码,是这样的:
在这段代码当中,dodo使用到的格式化时间“YYYY-MM-dd HH:mm:ss”。输出的结果却令人大吃一惊,发现时间和自己要格式化的时间有很多的差异,那么怎么会造成这样的事情呢。
dodo将时间格式化的时间样式换为“yyyy-MM-dd HH:mm:ss”。输出的结果却是符合要求的。
那么到底大写的“YYYY-MM-dd HH:mm:ss” 和小写的“yyyy-MM-dd HH:mm:ss”
有什么区别,还是这是一种API上的bug。
我们看官方的解释是这样的:
A week year is in sync with a WEEK_OF_YEAR cycle. All weeks between the first and last weeks (inclusive) have the same week year value. Therefore, the first and last days of a week year may have different calendar year values.
开发人员误用的格式符代表的是一种不同的日历系统。现行的公历通常被称为格里高利历(Gregorian calendar),它以400年为一个周期,在这个周期中,一共有97个闰日,在这种历法的设计中,闰日尽可能均匀地分布在各个年份中,所以一年的长度有两种可能:365天或366天。而本文提到的被错误使用的历法格式,是国际标准ISO 8601所指定的历法。这种历法采用周来纪日,样子看起来是这样的:2009-W53-7
。对于格里高利历中的闰日,它也采用“闰周”来表示,所以一年的长度是364或371天。并且它规定,公历一年中第一个周四所在的那个星期,作为一年的第一个星期。这导致了一些很有意思的结果,公历每年元旦前后的几天,年份会和ISO 8601纪年法差一年。比如,2015年的第一个周四是1月1日,所以1月1日所在的那周,就变成了2015年的第一周。代表ISO 8601的格式符是YYYY
,注意是大写的,而格里高利历的格式符是小写的yyyy
,如果不小心把这两者搞混了,时间就瞬间推移了一年!维基百科上也有词条专门解释ISO 8601。
所以在使用java.text.SimpleDateFormat 的时候大家一定要谨慎!!!