Java中日期格式化YYYY-DD的操作bug

写这篇博文是记录下跨年的bug。去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误。

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

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

1 yyyy 和 YYYY

别看字,看代码

@Test
 public void testWeekBasedYear() {
 Calendar calendar = Calendar.getInstance();
 // 2019-12-31
 calendar.set(2019, Calendar.DECEMBER, 31);
 Date strDate1 = calendar.getTime();
 // 2020-01-01
 calendar.set(2020, Calendar.JANUARY, 1);
 Date strDate2 = calendar.getTime();
 // 大写 YYYY
 SimpleDateFormat 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));
 // 小写 YYYY
 SimpleDateFormat 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-31用YYYY/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代表的是处于这一年中那一天,不是处于这个月的那一天,但是dd就没有问题。

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

结论

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

以上所述是小编给大家介绍的Java中日期格式化YYYY-DD的操作bug,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Java使用DateFormatter格式化日期时间的方法示例

    本文实例讲述了Java使用DateFormatter格式化日期时间的方法.分享给大家供大家参考,具体如下: Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; /** * Created by Fra

  • 详解Java中格式化日期的DateFormat与SimpleDateFormat类

    DateFormat 1. DateFormat 介绍 DateFormat 的作用是 格式化并解析"日期/时间".实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date转换成我们想要的String字符串供我们使用 不过DateFormat的格式化Date的功能有限,没有SimpleDateFormat强大:但DateFormat是SimpleDateFormat的父类.所以,我们先对DateFormat有个整体了解,然后再学习SimpleDateFormat.

  • java正则实现各种日期格式化

    java正则实现各种日期格式化 package com.st.test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.regex.Pattern; public class DateFormatUtil { @SuppressWarnings("finally") publ

  • Java日期时间格式化操作DateUtils 的整理

    Java日期时间格式化操作DateUtils 的整理 直接上代码,总结了开发过程中经常用到的日期时间格式化操作! import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; /** * ClassName: DateUtils <br/> * D

  • java日期格式化SimpleDateFormat的使用详解

    日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引号 (') 引起来,以免进行解释.所有其他字符均不解释:只是在格式化时将它们简单复制到输出字符串 白话文的讲:这些A--Z,a--z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出. 日期和时间模式(注意大小写,代表的含义是不同的) yyyy:年 MM:月 dd

  • Java中日期格式化YYYY-DD的操作bug

    写这篇博文是记录下跨年的bug.去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误. 当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据. 今天逛技术论论坛正好遇到Java日期的操作bug. 1 yyyy 和 YYYY 别看字,看代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.se

  • java中日期格式化的大坑

    前言 我们都知道在java中进行日期格式化使用simpledateformat.通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗? yyyy 和 YYYY 示例代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.set(2019, Calendar.DECEMBER, 31); Date strDate1

  • Java中SimpleDateFormat 格式化日期的使用

    包含在Java的 java.text.SimpleDateFormat;包中 日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引号 (') 引起来,以免进行解释.所有其他字符均不解释:只是在格式化时将它们简单复制到输出字符串 白话文的讲:这些A——Z,a——z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出.日

  • 详解 Java中日期数据类型的处理之格式转换的实例

    详解 Java中日期数据类型的处理之格式转换的实例 概要: 日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar类和Date类. Date类: 1.Date类型转String类型(以时间格式1970-01-01 01:01:01为例) //yyyy-MM-dd HH:mm:ss表示24时间进制 SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • Java中PageHelper分页后对list操作导致分页无效

    1.问题 阿里巴巴Java开发手册 1.1.PageHelper先开启分页,后对list数据操作 @Override public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) { PageHelper.startPage(pageNo,pageSize); List<HdQueryVo> hdQueryVosByView = actionMapper.getActionByView(); List&l

  • Java中的常用输入输出语句的操作代码

    一.概述 输入输出可以说是计算机的基本功能.作为一种语言体系,java中主要按照流(stream)的模式来实现.其中数据的流向是按照计算机的方向确定的,流入计算机的数据流叫做输入流(inputStream),由计算机发出的数据流叫做输出流(outputStream). Java语言体系中,对数据流的主要操作都封装在java.io包中,通过java.io包中的类可以实现计算机对数据的输入.输出操作.在编写输入.输出操作代码时,需要用import语句将java.io包导入到应用程序所在的类中,才可以

  • java中常用工具类之字符串操作类和MD5加密解密类

    java中常用的工具类之String和MD5加密解密类 我们java程序员在开发项目的是常常会用到一些工具类.今天我分享一下我的两个工具类,大家可以在项目中使用. 一.String工具类 package com.itjh.javaUtil; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import

  • java中的Io(input与output)操作总结(一)

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节(我想,文章太长了,谁都没耐心翻到最后) 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中,字符流有两个抽象类:Writer Reader 其对应子类FileWriter和FileReader可实现文件的读写操作 BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率 同样,字节流也有两个抽象类:Input

  • Java中集合关系图及常见操作详解

    下面是一张下载的Java中的集合类型的继承关系图,便于正确的理解和使用相应的集合类型. 几个面试常见问题: 1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别? A:Vector和HashTable是线程同步的(synchronized).性能上,ArrayList和HashMap分别比Vector和Hashtable要好. 2.Q:大致讲解java集合的体系结构 A:List.Set.Map是这个集合体系中最主要的三个接口.       其中Lis

随机推荐