首页 > 编程语言 >Java中YYYY-MM-dd在跨年时出现的bug

Java中YYYY-MM-dd在跨年时出现的bug

时间:2022-11-27 01:55:20浏览次数:60  
标签:12 Java MM dd YYYY 2019 31

先看一张图:

Bug的产生原因:

日期格式化时候,把 yyyy-MM-dd 写成了 YYYY-MM-dd 

Bug分析:

当时间是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

当时间是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 ,这显然是不对的。

日期格式化时,yyyy表示当天所在的年,而大写的YYYY代表的是week in which year(JDK7之后引入的概念)意思是当天所在的周属于的年份,案例中的2019-12-31这一天,按周算年份已经属于2020年,本周跨年,返回的YYYY就是下一年。

参考Class DateTimeFormatter的官方文档:

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns

 

 

参考javadoc中对week-based-year的说明:

https://docs.oracle.com/javase/8/docs/api/java/time/temporal/WeekFields.html

 

标签:12,Java,MM,dd,YYYY,2019,31
From: https://www.cnblogs.com/ycyzharry/p/16928859.html

相关文章

  • java中乐观锁CAS的实现探究——AtomicInteger
    CASCAS——compareandswap,比较并交换。是一种乐观锁的实现方式。更新操作时,在每次更新之前,都先比较一下被更新的目标T,值是不是等于读取到的旧值O,如果相等,则认为在读取......
  • JAVA网络编程TCP实现聊天功能,附在IDEA中同时运行2个或以上相同的java程序
    在IDEA中同时运行2个或以上相同的java程序在日常编写测试代码时,有时候会需要在idea上同时运行两个及以上相同的java程序,如:想运行两个CLIENTLOGIN测试聊天室效果。1.点击E......
  • java9
    Java9新特性Java9发布于2017年9月22日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍Java9的新特性。Java9新特性模块系......
  • 基于java+swing的图书管理系统
    功能展示登录管理员-主界面管理员-增加书籍管理员-更新和删除书籍管理员-查找书籍管理员-查找所有书籍管理员-添加用户管理员-更新和删除用户管理员-查找......
  • Javascript(笔记53) - promise - 3 几个关键问题
    如何改变Promise的状态?1)resolve(value):如果当前是pending 就会变为resolved(或fulfilled); 2)reject(reason):如果当前是pending 就会变为rejected; 3) 抛出异常:如......
  • java中abstract详解
     Abstract(抽象)可以修饰类、方法 如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。 Abstract可以将子类的共性最大限度的抽取出来,放......
  • Java基础——继承(Extends)
    使用extends(继承)有什么好处?使用继承可以实现代码的重用,通过继承,子类可以继承父类的成员变量及成员方法,同时子类也可以定义自己的成员变量和成员方法。届时,子类将具有父类......
  • java——@ApiOperation注解
    @RequestMapping(value="/add",method=RequestMethod.POST)@ApiOperation(value="添加用户")publicsynchronizedBaseResponse<Long>addUser(@RequestBody......
  • javascript 执行上下文
    <script>//执行上下文,顺序执行到此出会产生一个全局的执行上下文(ECG),并把全局ECG放到ECS(执行上下文栈)中//VO:GO(globanobject)对浏览器而言,window即......
  • 2022 Fudan Programming Contest Review
    2022FudanProgrammingContestReview一则短小的回顾,涉及比赛之外的东西比比赛本身可能要多。赛前干了什么呢?不妨把“赛前”这两个字拖得再长一些,首先得延长到网络预......