JAVA中,日期格式化YYYY 与yyyy区别

在Java中,YYYY表示Weekyear,与周相关,而yyyy表示实际年份。由于ISO8601规定,一年的第一周包含本年的第一个周四,因此可能导致日期跨年的现象。建议在日常编程中使用小写y来避免混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在java中我们时常会使用到日期格式化,例如“YYYY-MM-dd”、“yyyy-MM-dd”

今天我们来看一下大写Y与小写y有什么不同。

先总结:尽量使用小写y来表示年份。

我们直接来看代码

1.将日期设置成2023年12月31日,并且分别使用大写Y和小写y进行格式化打印;

2.结果

我们惊讶的发现,同一天打印出来的结果竟然不一致。

中间整整跨越了一年。

原因:

“YYYY”表示的是Week year,就是这天所在的周所属的年。而每年的第一周是怎么定义的呢。

ISO 8601中给出了定义:本年第一个周四所在的那一个星期。

按照日历我们可以发现,2024年的第一个周四是一月四号,而一周的第一天是周日,2023年的12月

31日刚好是2024年的第一周的周日。所以YYYY将2023年12月31日算在了2024年;

小写yyyy表示的就是年份。

所以在日常代码中我们使用小写y来格式化。以防止发生bug。

### 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` 并不是按照传统意义上的自然年来划分,所以在设计应用程序逻辑时务必谨慎对待这两种表达方式的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值