Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y

场景

SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类。

它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期 - 时间格式的模式。

在Java中,可以使用SimpleDateFormat的format方法,将一个Date类型转化为String类型,并且可以指定输出格式

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(date);
        System.out.println(dateStr);

在Java中,可以使用 SimpleDateFormat 的 parse 方法,将一个 String 类型转化成 Date 类型。

 System.out.println(sdf.parse(dateStr));

那么在格式化模式中表示年为什么只能使用yyyy,而不让用YYYY?

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

在格式表达式中,y表示year,而Y表示Week Year。

什么是Week Year?

不同的国家对于一周的开始和结束的定义是不同的。

如在中国,我们把星期一作为一周的第一天,而在美国,他们把星期日作为一周的第一天。

同样,如何定义哪一周是一年当中的第一周?

因为不同人对于日期和时间的表示方法有不同的理解,于是,大家就共同制定了一个国际规范:ISO 8601

国际标准化组织的国际标准 ISO 8601 是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。

在 ISO 8601 中。对于一年的第一个日历星期有以下四种等效说法:

 1,本年度第一个星期四所在的星期;

 2,1 月 4 日所在的星期;

 3,本年度第一个至少有 4 天在同一星期内的星期;

4,星期一在去年 12 月 29 日至今年 1 月 4 日以内的星期;

举例:

根 据 ISO 8601 标 准,2019 年 12 月 29 日、2019 年 12 月 30 日、2019 年 12 月 31 日这两天,

其实不属于 2019 年的最后一周,而是属于 2020 年的第一周。

JDK针对ISO8601提供的支持

Java 7 引入了「YYYY」作为一个新的日期模式来作为标识。

使用「YYYY」作为标识,再通过 SimpleDateFormat 就可以得到一个日期所属的周属于哪一年了。

看下面的示例代码

        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy");
        System.out.println(sdf3.format(sdf1.parse("2019-12-30")));//2019
        System.out.println(sdf2.format(sdf1.parse("2019-12-30")));//2020
        System.out.println(sdf2.format(sdf1.parse("2020-01-01")));//2020

后面跟的是输出结果。

猜你喜欢

转载自blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131052335
今日推荐