19年底,一个比较出名,影响比较大的bug,就是这个YYYY和yyyy,DateFormat的格式确实很多,没有认真学习过的人,比较容易犯错,除非你一直copy前人的正确代码,当然,前人写的也有可能有问题。
我当然也写了这个bug出来,然后当时计划任务判断时间的时候,时间就不相等,导致计划任务没有执行,幸运的是,那个计划任务只是一个推送通知的计划任务,不是很重要,但是,还是得引起足够重视。我去查看原因的时候,看到自己写的是YYYY,当然我不可能一眼就看出猫腻,我看了一下,觉得代码没问题啊,而且之前一直都是好好的,为什么今天出问题了呢,百思不得其解。我就把代码copy出来,测试一下,用今天的日期,发现确实不满足我的判断条件,然后我看转换出来的日期是2020年,有趣!我就想应该是日期格式化的问题,然后去百度搜了一下,发现这已经是一个热门bug了,哈哈哈
DateFormat dfYYYY = new SimpleDateFormat("YYYY-MM-dd");//YYYY
DateFormat dfyyyy = new SimpleDateFormat("yyyy-MM-dd");//yyyy
String date = "2019-12-29";
//先转换为正常的日期,再格式化看差别
System.out.println(dfyyyy.format(dfyyyy.parse(date)));//2019-12-29
System.out.println(dfYYYY.format(dfyyyy.parse(date)));//2020-12-29
SimpleDateFormat各字母代表的含义
字母 | 日期或时间元素 | 类型 | 示例 |
---|---|---|---|
G | Era 标志符 | Text | AD |
y | 年份 | Number | 1996; 96 |
M | 年份中的月份 | Text | July; Jul; 07 |
w | 年份中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年份中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |