Java时间模式中‘yy’与‘YY’的区别是什么?
Java中
yy与YY的核心区别:日历年 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 → 19YY取的是周年度的后两位: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




