Java日期中YYYY与yyyy的区别

博客详细分析了Java中日期格式化符号YYYY与yyyy的区别,通过代码示例展示了当使用YYYY时,日期会根据周跨越年份,而yyyy始终按照实际年份输出。问题出现在2021年12月26日,由于该日期属于跨年的周,使用YYYY会导致显示2022年。

0.码仙励志

旁观者的姓名永远爬不到比赛的计分板上。

1.Java日期中YYYY与yyyy的区别

今天是2021的最后一天,正好今天有空,可以记录一下前几天发现的一个问题。

问题描述:前几天(2021年)发现服务器上的一个获取当前日期的方法获取到了2022年是时间,首先想到的就是服务器时间是不是不准了,经过排查,发现不是服务器的问题,而是因为获取当前时间把yyyy写成了YYYY。

我们用代码案例来描述一下:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * java日期中YYYY与yyyy的区别
 */
public class DateTest {
    public static void main(String[] args) {
        DateFormat lowerCase = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat upperCase = new SimpleDateFormat("YYYY-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.set(2021, Calendar.DECEMBER, 19);
        for (int i = 1; i < 22; i++) {
            System.out.println(lowerCase.format(calendar.getTime()) + "=========" + upperCase.format(calendar.getTime()));
            calendar.add(Calendar.DATE, 1);
        }
    }
}

运行结果如下:

2021-12-19=========2021-12-19
2021-12-20=========2021-12-20
2021-12-21=========2021-12-21
2021-12-22=========2021-12-22
2021-12-23=========2021-12-23
2021-12-24=========2021-12-24
2021-12-25=========2021-12-25
2021-12-26=========2022-12-26
2021-12-27=========2022-12-27
2021-12-28=========2022-12-28
2021-12-29=========2022-12-29
2021-12-30=========2022-12-30
2021-12-31=========2022-12-31
2022-01-01=========2022-01-01
2022-01-02=========2022-01-02
2022-01-03=========2022-01-03
2022-01-04=========2022-01-04
2022-01-05=========2022-01-05
2022-01-06=========2022-01-06
2022-01-07=========2022-01-07
2022-01-08=========2022-01-08

从运行结果可以分析出来,问题从2021-12-26开始发生。
我们先上一张日历图再分析问题。
在这里插入图片描述
从图中可以发现,2021-12-26和2022-01-01在同一周。
经过查阅资料得知:
y:year-of-era;正正经经的年,即元旦过后
Y:week-based-year;只要本周跨年,那么这周就算入下一年

就比如说 2021-12-26 到 2021-12-31 这几天是跨年的一周,那使用 YYYY 的话会显示 2022,使用 yyyy 则会从 2022-01-01 才开始算是 2022。

### Java 期格式 `yyyy` `YYYY` 的区别Java 中,`SimpleDateFormat` 或者新的 `DateTimeFormatter` 类用于处理期和时间的格式化。其中,`yyyy` 和 `YYYY` 是两种不同的模式字母,用来表示年份。 - **`yyyy` 表示公历年**:这是最常见的形式,它指的是历中的实际年份。对于大多数应用场景来说,应该优先考虑使用此选项来获取正确的年份信息[^4]。 - **`YYYY` 表示周年的年**:也称为“弱年”,即当前星期所属的那个年份的一部分。这意味着如果一年的最后一周跨越到了下一年,则该周会被认为属于新一年的部分。因此,在某些特定情况下(例如涉及到每周的第一天),可能会得到意想不到的结果[^5]。 #### 实际案例分析 为了更好地理解两者之间的差异,下面通过一段代码展示不同之处: ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) throws Exception{ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("YYYY-[Www]-E"); LocalDateTime dateTime = LocalDateTime.parse("2023-12-31 12:00:00", formatter); System.out.println(dateTime.format(formatter)); // 输出标准期时间 System.out.println(dateTime.format(formatter1)); // 使用 YYYY 格式的输出 LocalDateTime nextYearFirstDay = dateTime.plusDays(7); System.out.println(nextYearFirstDay.format(formatter)); System.out.println(nextYearFirstDay.format(formatter1)); } } ``` 上述程序会打印出两个版本的时间戳——一个是基于常规年 (`yyyy`) ,另一个则是基于周年(`YYYY`) 。当给定时间为接近年底时,可以看到明显的差别;特别是当一周横跨两年的情况下,`YYYY` 可能不会返回预期的那一年。 #### 结论 综上所述,在开发过程中推荐采用 `yyyy` 来确保获得确切的历年份,除非有特殊需求要遵循 ISO8601 周定义的方式计算年份。此外需要注意的是,由于 `YYYY` 并不是按照传统意义上的自然年来划分,所以在设计应用程序逻辑时务必谨慎对待这两种表达方式的选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值