SimpleDateFormat中的一些奇异的事情

Posted zhaixingzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的时候大家一定要谨慎!!!

以上是关于SimpleDateFormat中的一些奇异的事情的主要内容,如果未能解决你的问题,请参考以下文章

R解决:系统完全是奇异的

scipy 最小化 SLSQP - 'LSQ 子问题中的奇异矩阵 C'

奇异值分解SVD

[机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用

主成分分析法(PCA)(含SVD奇异值分解)等降维(dimensionality reduction)算法-sklearn

避免分析中的奇异性——OpenMDAO 是不是自动启用“完全同步”解决方案?