时间格式 YYYY-MM-dd 的 bug【Java】

前一阵子,我们项目中遇到了一个 bug,时间格式的bug,2019-12-31那天显示成了2020-12-31,在网上一搜,也有其他人遇到了同样的 bug,这里就对这个问题记录一下。

一直以来使用 yyyy 和 YYYY 结果都一样,也就没有去研究它们之间的区别,但是这次遇到了这个 bug,所以就去研究了一下。那么产生这个 bug 的原因是什么呢?其实很简单,就是把 yyyy-MM-dd 写成了 YYYY-MM-dd 。

一、当时间是 2019-08-31 时,代码如下:

public class DateTest {
  public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    
    calendar.set(2019, Calendar.AUGUST, 31);
    
    Date strDate = calendar.getTime();
    
    DateFormat formatUpperCase = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println("2019-08-31 to yyyy-MM-dd: " + formatUpperCase.format(strDate));
    
    formatUpperCase = new SimpleDateFormat("YYYY-MM-dd");
    System.out.println("2019-08-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate));
  }
}

结果为:

2019-08-31 to yyyy-MM-dd: 2019-08-31
2019-08-31 to YYYY/MM/dd: 2019-08-31

这里是没有问题的, 使用 yyyy-MM-dd 和 YYYY-MM-dd 结果是一样的。

 

二、当时间是 2019-12-31 时,代码如下: 

public class DateTest {
  public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();

    calendar.set(2019, Calendar.DECEMBER, 31);

    Date strDate = calendar.getTime();

    DateFormat formatUpperCase = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println("2019-12-31 to yyyy-MM-dd: " + formatUpperCase.format(strDate));

    formatUpperCase = new SimpleDateFormat("YYYY-MM-dd");
    System.out.println("2019-12-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate));
  }
}

结果为:

2019-12-31 to yyyy-MM-dd: 2019-12-31
2019-12-31 to YYYY/MM/dd: 2020-12-31

这里出现了问题, 使用 yyyy-MM-dd 时结果为 2019-12-31 是正确的,但是使用  YYYY-MM-dd  结果为 2020-12-31 ,这显然是不对的。

出现这个结果的原因其实很简单,就是因为 Y  和  y  实际上代表了不同的含义,具体含义见下图。

  • y:year-of-era;是正常的年;

  • Y:week-based-year;只要本周跨年,那么这周就算入下一年;

到这里算是明白了这个 bug 的始末,但是想了半天也没有想明白这个 YYYY 它的意义在哪里以及什么样的场景会使用 YYYY 来做时间格式化。这个该不会是 Java 自己的 bug 吧?

发布了46 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yun_ld/article/details/104024565