作者:兔子托尼啊

https://zhuanlan.zhihu.com/p/101150248

写这篇博文是记录下跨年的bug。

去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误。

当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据。

今天逛技术论论坛正好遇到Java日期的操作bug。

1 yyyy 和 YYYY

别看字,看代码

@Test
public void testWeekBasedYear() {Calendar calendar = Calendar.getInstance();// 2019-12-31calendar.set(2019, Calendar.DECEMBER, 31);Date strDate1 = calendar.getTime();// 2020-01-01calendar.set(2020, Calendar.JANUARY, 1);Date strDate2 = calendar.getTime();// 大写 YYYYSimpleDateFormat formatYYYY = new SimpleDateFormat("YYYY/MM/dd");System.out.println("2019-12-31 转 YYYY/MM/dd 格式: " + formatYYYY.format(strDate1));System.out.println("2020-01-01 转 YYYY/MM/dd 格式: " + formatYYYY.format(strDate2));// 小写 YYYYSimpleDateFormat formatyyyy = new SimpleDateFormat("yyyy/MM/dd");System.out.println("2019-12-31 转 yyyy/MM/dd 格式: " + formatyyyy.format(strDate1));System.out.println("2020-01-01 转 yyyy/MM/dd 格式: " + formatyyyy.format(strDate2));
}

输出结果:

2019-12-31 转 YYYY/MM/dd 格式: 2020/12/31
2020-01-01 转 YYYY/MM/dd 格式: 2020/01/01
2019-12-31 转 yyyy/MM/dd 格式: 2019/12/31
2020-01-01 转 yyyy/MM/dd 格式: 2020/01/01

细心的同学应该发现了2019-12-31YYYY/MM/dd 此刻变成了2020/12/31

??为何呢?

YYYY这么大的能耐,能跑到2020年代去?

我2019年底买的东西,你如果用YYYY来格式化出库日期,我是不是得到2020年底才能收到货?此bug问题挺大的呀!

YYYY 到底是何方妖怪?????

Java's DateTimeFormatter pattern "YYYY" gives you the week-based-year, (by default, ISO-8601 standard) the year of the Thursday of that week.

例子:

下面就是用YYYY格式化代码

  • 12/29/2019 将会格式化到2019年 这一周还属于2019年

  • 12/30/2019 将会格式化到2020年 这一周已经属于2020年

看字说话YYYY,week-based year 是 ISO 8601 规定的。

2019-12-31号这一天,安周算年份已经属于2020年了,格式化之后就变成2020年,后面的月份日期不变。

2 dd 和 DD

private static void tryit(int Y, int M, int D, String pat) {DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pat);LocalDate dat = LocalDate.of(Y,M,D);String str = fmt.format(dat);System.out.printf("Y=%04d M=%02d D=%02d " +"formatted with " +"\"%s\" -> %s\n",Y,M,D,pat,str);
}
public static void main(String[] args){tryit(2020,01,20,"MM/DD/YYYY");tryit(2020,01,21,"DD/MM/YYYY");tryit(2020,01,22,"YYYY-MM-DD");tryit(2020,03,17,"MM/DD/YYYY");tryit(2020,03,18,"DD/MM/YYYY");tryit(2020,03,19,"YYYY-MM-DD");
}

输出结果:

Y=2020 M=01 D=20 formatted with "MM/DD/YYYY" -> 01/20/2020
Y=2020 M=01 D=21 formatted with "DD/MM/YYYY" -> 21/01/2020
Y=2020 M=01 D=22 formatted with "YYYY-MM-DD" -> 2020-01-22
Y=2020 M=03 D=17 formatted with "MM/DD/YYYY" -> 03/77/2020
Y=2020 M=03 D=18 formatted with "DD/MM/YYYY" -> 78/03/2020
Y=2020 M=03 D=19 formatted with "YYYY-MM-DD" -> 2020-03-79

看到没有?

最后的3个日期都错误了,这里的大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天。

小伙伴们一定要记住了不要犯类似的错误。

3、结论

YYYY和yyyy不一样的,DD和dd也是不一样要切记。

此锅我们不背。

推荐阅读
AndroidStudio里面竟然有程序员鼓励师?
什么是工程师文化?
2020,请对我好点!

编程·思维·职场
欢迎扫码关注

YYYY-MM-DD 的黑锅,我们不背!相关推荐

  1. 【怒怼老乔】苹果手机ios系统居然特喵的不支持日期yyyy-MM-dd HH:mm:ss.ms,只支持 yyyy/MM/dd HH:mm:ss

    苹果手机ios系统居然特喵的 不支持日期yyyy-MM-dd HH:mm:ss.ms, 只支持yyyy/MM/dd HH:mm:ss 我只能用 .replace(/\-/g,'\/'); 来替换掉了, ...

  2. 得到 yyyy/mm/dd 格式时间

    在做项目的时候:很多文件都是按数据添加时间的年/月/日的目录保存 做的时候发现不能直接 DateTime(yyyy-mm-dd).ToString("yyyy/MM/dd")得到 ...

  3. yyyy/MM/dd转换成yyyy-MM-dd,yyyy-MM-dd转换成yyyy/MM/dd你会了吗

    第一种yyyy/MM/dd转换成yyyy-MM-dd 知识点来自官网,可查阅: split() 方法用于把一个字符串分割成字符串数组 join()方法用于把数组中的所有元素放入一个字符串 var my ...

  4. 将字符串格式yyyy/MM/dd的字符串转为日期,格式“yyyy-MM-dd“

    将字符串格式yyyy/MM/dd的字符串转为日期,格式"yyyy-MM-dd" public static String strToDateFormat(String date) ...

  5. Js日期yyyy-MM-dd与yyyy/MM/dd的区别

    在JavaScript中日期yyyy-MM-dd格式与yyyy/MM/dd为不同的日期表达式 console.log('2020-10-29', new Date('2020-10-29')) con ...

  6. yyyy/mm/dd变成yyyy-mm-dd

    当电脑的日期格式不是yyyy/mm/dd的形式的时候,假使是yyyy-mm-dd格式, 即便在程序中格式化日期格式yyyy/mm/dd,但是做成的日期却是yyyy-mm-dd. 不能只是单纯的Shor ...

  7. Kettle5.2 couldn't convert string [...] to a date using format [yyyy/MM/dd HH:mm:ss.SSS]

    使用kettle出现 couldn't convert string [...] to a date using format [yyyy/MM/dd HH:mm:ss.SSS] 试了各种方法,最后发 ...

  8. YYYY/MM/dd 日期format的幺蛾子

    其实YYYY/MM/dd 和yyyy/MM/dd是不同的,而且YYYY/MM/dd 可能会出现年份的大bug,下面直接上代码 @org.junit.Testpublic void dateYYYY() ...

  9. Python写,将输入的yyyy/mm/dd格式的日期显示为yyyy年mm月dd日。

    7.(程序题)编程将输入的yyyy/mm/dd格式的日期显示为yyyy年mm月dd日. str = input("请输入日期:") length=len(str) if str[6 ...

  10. C# 中的年月日时分秒 yyyy MM dd HH mm ss

    C# 中的年月日时分秒 yyyy MM dd HH mm ss 其中大小写含义不同,不能混用 年:yyyy 月:MM 日:dd(1-31) DD(0-365) 时:hh:12小时制 HH:24小时制 ...

最新文章

  1. 数据结构与算法分析——C语言描述
  2. Maven出现User setting file does not exist ...\.m2\setting.xml的问题解决(同时也解决用户.m2目录下无setting.xml文件)...
  3. Scala学习(二)练习
  4. 【干货】极简体验+免费真的万能嘛?北森Saas第一坑:免费
  5. 使用psycopg2操作PostgreSQL数据库之二
  6. 【斐波那契数列】算法优化笔记
  7. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
  8. JVM性能分析与定位
  9. Activity间的转场动画(overridePendingTransition)
  10. python下面的代码_求下面python代码的差别。
  11. Netty学习总结(1)——Netty入门介绍
  12. (补)20200328:两两交换链表中的节点(leetcode24)
  13. 3 款实用的在线JS代码工具推荐
  14. python实现四阶龙格库塔法
  15. H3C 无线控制器WX2510H-F与无线接入点WA5320-C-EI的安装与关联详细指导书
  16. 前端三大框架React、Vue、Angular简述
  17. DiskGenius无法分区
  18. 《Excel大神上分攻略》学习笔记3——函数求和及常见函数
  19. C 二维数组,以及自定义二维数组
  20. JSP 电影共享网站系统jsp编程语言mysql数据库myeclipse开发

热门文章

  1. 攻克微服务中的最大难点:用户数据
  2. 苹果cmsV10魔改短视多功能主题5.2版本
  3. 以目标为导向的需求工程建模方法:KAOS
  4. valuable的用法_valuable是什么意思_valuable的翻译_音标_读音_用法_例句_爱词霸在线词典...
  5. 生活 RH阴性血 AB型
  6. 使用Nginx搭建直播服务器(nginx-rtmp-module)
  7. RT-Thread—STM32—enc28j60
  8. OSI七层模型、TCP/IP四层模型
  9. mysql数据库收缩
  10. Windows下创建自定义服务的正确姿势(InstrsrvSrvany)