You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java时间模式中‘yy’与‘YY’的区别是什么?

Java中yyYY的核心区别:日历年 vs 周年度

你遇到的2019年12月30日的差异,其实是Java日期格式化里一个很容易踩坑的细节——yy对应普通日历年的后两位,而YY对应ISO周年度的后两位,刚好这一天是两种年度的分界点。

先搞清楚两个关键概念:

  • 日历年(Calendar Year):就是我们日常用的公历年份,范围是当年1月1日到12月31日,比如2019年的区间就是2019-01-01至2019-12-31。
  • ISO周年度(Week-based Year):这是基于ISO周历的特殊年份规则:
    • 一周从星期一开始
    • 一年的第一周必须包含该年的1月4日(或者说,这一周至少有4天属于当前日历年)
    • 因此,有些日历年的末尾几天会被划分到下一个周年度,同理,年初的几天也可能属于上一个周年度

回到你的案例:2019年12月30日

这一天是星期一,对应的ISO周是2020年的第1周——因为2020年1月4日(周六)落在这个周内,所以这个周属于2020的周年度。因此:

  • yy取的是日历年的后两位:2019 → 19
  • YY取的是周年度的后两位:2020 → 20

用代码验证一下(Java 8+推荐使用java.time包):

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class YearPatternTest {
    public static void main(String[] args) {
        LocalDate boundaryDate = LocalDate.of(2019, 12, 30);
        
        // 日历年的后两位
        String yy = DateTimeFormatter.ofPattern("yy").format(boundaryDate);
        // 周年度的后两位
        String YY = DateTimeFormatter.ofPattern("YY").format(boundaryDate);
        
        System.out.println("yy值: " + yy); // 输出 19
        System.out.println("YY值: " + YY); // 输出 20
    }
}

额外提醒:

如果你用的是旧版的SimpleDateFormat,规则也是完全一致的,不过现在更推荐使用java.time包下的日期类,线程安全且API设计更清晰。

内容的提问来源于stack exchange,提问作者user2992029

火山引擎 最新活动