在日期格式化中,yyyy
和 YYYY
都用于表示 “年”,但二者的语义和适用场景有本质区别,核心差异在于它们基于的时间周期不同:
1. yyyy
:日历年(Calendar Year)
- 定义:表示传统意义上的 “自然年”,即从 1 月 1 日到 12 月 31 日的完整年份。
- 适用场景:绝大多数日常日期场景,直接对应我们生活中使用的年份(如 2023 年、2024 年)。
- 示例:
- 2023 年 12 月 31 日,
yyyy
格式化后为2023
。 - 2024 年 1 月 1 日,
yyyy
格式化后为2024
。
- 2023 年 12 月 31 日,
2. YYYY
:周年(Week Year)
- 定义:表示 “周所在的年份”,基于 ISO 周历系统(每周从周一开始,一年至少包含 52 周,最多 53 周)。
- 特殊规则:
- 如果一年的最后几天(12 月底)属于下一年的第一周,则这些日期的
YYYY
会显示为下一年。 - 同理,如果一年的前几天(1 月初)属于上一年的最后一周,则这些日期的
YYYY
会显示为上一年。
- 如果一年的最后几天(12 月底)属于下一年的第一周,则这些日期的
- 示例:
- 假设 2023 年 12 月 31 日是周一,且这一天属于 2024 年的第 1 周(根据 ISO 周历规则),则
YYYY
格式化后为2024
,而yyyy
仍为2023
。 - 假设 2024 年 1 月 1 日是周日,且属于 2023 年的第 53 周,则
YYYY
为2023
,yyyy
为2024
。
- 假设 2023 年 12 月 31 日是周一,且这一天属于 2024 年的第 1 周(根据 ISO 周历规则),则
3. 常见问题:混用导致的日期错误
如果错误地用 YYYY
代替 yyyy
,可能在年底或年初出现年份偏差。例如:
// Java 示例
SimpleDateFormat sdfY = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat sdfy = new SimpleDateFormat("yyyy-MM-dd");
Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2023-12-31");
System.out.println(sdfY.format(date)); // 可能输出 2024-12-31(若该日属于2024年第1周)
System.out.println(sdfy.format(date)); // 一定输出 2023-12-31
总结
符号 | 含义 | 适用场景 | 注意事项 |
---|---|---|---|
yyyy | 自然年(1-12 月) | 绝大多数日常日期格式化 | 推荐优先使用 |
YYYY | 周所在的年份(ISO 周历) | 需按周统计年份的场景(如财务周报表) | 避免在普通日期场景中使用,易导致年份错误 |
记住:日常开发中,用 yyyy
表示年份即可,YYYY
仅在明确需要按周历规则处理年份时使用