【熊说苍穹】关于列表格式化字符中日期格式YYYY、yyyy那些事(本质上是Java问题)原创
金蝶云社区-福分小熊
福分小熊
2人赞赏了该文章 1516次浏览 未经作者许可,禁止转载编辑于2021年11月29日 01:06:11

参考文献


全文总结就一句话,设置格式化字符的时候,不要用YYYY-MM,要使用yyyy-MM




一、知识点

(一)Java常用格式为:yyyy-MM-dd HH:mm:ss

以 2021-12-31 18:07:59:666 时间为例:

注意区分字母大小写

Letter含义Example
yyyyy------>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 
sss-------->59
S毫秒SSS--------->666
YWeek YearYYYY---->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。时间看起来是提前了。

image.png




(二)关于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

image.png



二、遇到的问题及解决办法

开发平台中列表中设置的格式化字符为:YYYY-MM

image.png

前端显示:其中2021-12-31的前端显示有问题


image.png

本质上是YYYY和yyyy区别造成的。

解决办法:将YYYY-MM改成yyyy-MM

image.png

编码规则中也是一样的道理

image.png



但是我在表单编辑界面使用YYYY-MM格式化字符,显示的却是没有问题的。暂不明确为什么这边不会有这个问题。

image.png

image.png

赞 2