解读阿里巴巴Java手册:为什么格式化时间是强制使用yyyy而不能使用YYYY

解读阿里巴巴Java手册:为什么格式化时间是强制使用yyyy而不能使用YYYY_第1张图片
从手册上可以看出,使用YYYY一般情况下是没有问题的,只是在涉及到跨年的时候才会出现问问题,但这种问题往往也是致命的。

像礼拜几是一周的第一天问题一样,中国是把礼拜一作为一周的第一天,而美国把礼拜天作为一周的第一天。在哪一周是一年的第一周这个问题上也存在这种问题。

为了解决这个问题,国际标准化组织制订了国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000。

第一个日历星期有以下四种等效说法:

  1. 本年度第一个星期四所在的星期;
  2. 1月4日所在的星期;
  3. 本年度第一个至少有4天在同一星期内的星期;
  4. 星期一在去年12月29日至今年1月4日以内的星期;.

在来看一下JDK是如何定义的

解读阿里巴巴Java手册:为什么格式化时间是强制使用yyyy而不能使用YYYY_第2张图片
在规定中,y表示year,而Y表示Week Year!用代码来验证下:

public static void main(String[] args) throws ParseException{
     
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY-MM-dd");
        System.out.println("2019-12-01转换为"+sdf1.format(sdf.parse("2019-12-01")));
        System.out.println("2019-12-30转换为"+sdf1.format(sdf.parse("2019-12-30")));
        System.out.println("2020-01-01转换为"+sdf1.format(sdf.parse("2020-01-01")));
	}
2019-12-01转换为2019-12-01
2019-12-30转换为2020-12-30
2020-01-01转换为2020-01-01

可以看到使用YYYY转换的遇到跨年的一周时会出现问题(根据ISO 8601规则可能出现)
当我们要表示日期的时候,一定要使用 yyyy-MM-dd 而不是 YYYY-MM-dd

你可能感兴趣的:(java,阿里Java手册,java)