文本主要介绍了Java中日期格式设置的常见误区,特别是YYYY与yyyy的区别。指出在设置日期格式时应使用yyyy-MM而非YYYY-MM,因为YYYY代表周年份可能导致跨年时日期年份与实际不符。此外,文本还对比了Java与Oracle的日期格式差异,并提到苍穹日期字段的默认输出格式。最后,文本通过实际例子说明了YYYY-MM在开发平台中可能引发的问题及解决方法。
参考文献
全文总结就一句话,设置格式化字符的时候,不要用YYYY-MM,要使用yyyy-MM
一、知识点
(一)Java常用格式为:yyyy-MM-dd HH:mm:ss
以 2021-12-31 18:07:59:666
时间为例:
注意区分字母大小写
Letter | 含义 | Example |
y | 年 | yyyy------>2020 |
M(大写的M) | 月 | MM------->12 |
d | 一月中的天数 | dd--------->31 |
H | 小时(0-23) | HH--------->18 24 小时制的是大写的H |
h | 小时(1-12) | hh---------->06 12小时制的是小写的h |
m(小写的m) | 分 | mm-------->07 |
s | 秒 | ss-------->59 |
S | 毫秒 | SSS--------->666 |
Y | Week Year | YYYY---->2022 |
D | 一年中天数 | DD-------->365 |
而yyyy-MM-dd与YYYY-MM-dd区别在哪里?
Y 代表 Week Year,表示当天周所在的年份。这种方式将会把一年划分成52 周/53周(类似于闰年的概念,每隔几年将会增加一周)。
Week Year下每周仅属于某一年,如果某年的第一周或最后一周跨年,就会导致部分日期年份与实际不符。
Week Year 存在两种标准:
ISO 8601:国际标准,每周从周一开始,每年的第一周至少包含 4 天
Common:通用标准,每周从周日开始,每年的第一周至少包含 1 天
使用 ISO 8601 标准,分别看一下最后一周跨年以及第一周跨年的例子。
2015 年最后一周跨年,2016 前三天(与2015年12月的前四天默认是一周,是2015的周).
如果2016-01-01,使用 YYYY 最后结果为2015,时间看起来被回退了。
2020 年第一周跨年,2019 年最后两天(不足4天,所以默认为下周,下周为2020年的周)
如果2019-12-30,使用 YYYY最后结果为2020。时间看起来是提前了。
苍穹中格式化字符测试后发现走的是Common的模式
2015 年最后一周跨年,2016 前三天(与2015年12月的前四天默认是一周,是2016的周).
如果2015-12-31,使用 YYYY 最后结果为2016,时间看起来是提前了。
2020 年第一周跨年,2019 年最后两天(不足4天,所以默认为一周,为2020年的周)
如果2019-12-31,使用 YYYY最后结果为2020。时间看起来是提前了。
(二)关于JAVA中的日期格式和Orcale日期格式区别
java中的的日期格式为:
yyyy-MM-dd HH:mm:ss:代表将时间转换为24小时制,例: 2020-01-07 13:21:55 yyyy-MM-dd hh:mm:ss: 代表将时间转换为12小时制,例: 2020-01-07 01:21:55
oracle中的日期格式为(不区分大小写):
yyyy-MM-dd HH24:mi:ss:代表oracle中的24小时制,例:2020/1/7 13:21:55 yyyy-MM-dd HH:mi:ss: 代表oracle中的12小时制,例:2020/1/7 1:21:55
之所以 oracle和java不同,是因为我们知道oracle是不区分大小写的,所以java中根据大小写来代表24小时和12小时的表达式在oracle中就会出问题,oracle中将24小时的时和分做了特殊处理。如上所示,在hh后面加上了24,将mm改为了mi。
(三)苍穹日期字段默认输出格式yyyy-MM-dd
二、遇到的问题及解决办法
开发平台中列表中设置的格式化字符为:YYYY-MM
本质上是YYYY和yyyy区别造成的。
解决办法:将YYYY-MM改成yyyy-MM
编码规则中也是一样的道理
但是我在表单编辑界面使用YYYY-MM格式化字符,显示的却是没有问题的。暂不明确为什么这边不会有这个问题。
推荐阅读