JAVA日期格式化中的“yyyy”与“YYYY”

大家在做开发时,尤其是前后端交互时经常会遇到将字符串类型变量转换成日期类型变量,或者将日期类型变量转换为字符串类型变量。

这样的场景大家一般会用SimpleDateFormat来进行转换吧。转换时如果涉及到年就会指定年的格式。可是大家知道年的格式有“yyyy”,“YYYY”大小写的区分吗?知道这两个有什么区别吗?

JAVA既然定义了这样大小写两种的形式,自然是有区别的。像表示时间格式的“H”和“h”,“H”是表示24小时制的,而“h”则是表示12小时制的。而“YYYY”和“yyyy”也是有很大区别的,用不对的话是会有大问题的。

俗话说,耳听为虚,眼见为实。直接编码执行看看。

JAVA日期格式化中的“yyyy”与“YYYY”_java

大家觉得执行结果会是什么呢,会是下面这样?

yyyy-MM-dd格式:2019-12-29

YYYY-MM-dd格式:2019-12-29

下面就是见证奇迹的时刻,一起来看执行结果吧。

JAVA日期格式化中的“yyyy”与“YYYY”_字符串_02

惊不惊讶,“YYYY-MM-dd”的格式整整跨越了一年。

可能有的朋友在2019年底的时候看过类似的报道,好多网站或者APP显示日期变成了2020年底。究其原因就是因为做日期格式转换时用了这个“YYYY”。

“YYYY”表示的是Week year,就是这天所在的周所属的年。而每年的第一周是怎么定义的呢。

ISO 8601中给出了定义:本年第一个周四所在的那一个星期。

JAVA日期格式化中的“yyyy”与“YYYY”_java_03

那2020年的第一周按照这个定义就是2019年12月29日至2020年1月5日这7天。所以我们的示例中12月29日就算在2020年的第一周了。按照Week year,2019年12月29日也就算在2020年了。

如此就有了我们示例的执行结果。

这个逻辑一般我们都是不会用的,所以代码中的做日期个时候操作是一定要用“yyyy”而不要用“YYYY”哦。不然老板找你时不要说我没有提醒你哦。