
前阵子做项目复盘,扒线上历史异常日志的时候,突然刷到一段日期格式化代码,直接瞳孔地震:
new SimpleDateFormat("YYYY-MM-dd")很多程序员写日期处理逻辑时,要么被大小写格式符搞懵,要么图省事抄错示例,随手就把 YYYY 和 MM 全大写了。但是家人们,在 Java 里这么写,纯属给系统埋雷啊!这颗雷还特隐蔽,平时安安静静,一到跨年就炸,搞不好就得背锅返工。
跨年都懂吧,就是公历每年 12月31日 到新年 1月1日,因此我特意搭了个模拟场景,把时间拉到跨年临界点——2026年12月31日,直接上代码,看看到底有多坑:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateFormatTest {
public static void main(String[] args) {
// 构造跨年临界时间:2026年12月31日
Calendar calendar = Calendar.getInstance();
calendar.set(2026, Calendar.DECEMBER, 31);
Date date = calendar.getTime();
// 正确写法——小写 yyyy
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
// 错误写法——大写 YYYY
SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY-MM-dd");
System.out.println("小写 yyyy: " + sdf1.format(date));
System.out.println("大写 YYYY: " + sdf2.format(date));
}
}运行结果一出来,谁看了不懵圈?直接上截图既视感:

// 正常输出
小写 yyyy: 2026-12-31
// 划重点!年份直接跑偏到2027年,离大谱了家人们
大写 YYYY: 2027-12-31懂的都懂!明明是 2026 年的日期,用大写 YYYY 一格式化,直接穿越到 2027 年,这要是在线上,业务逻辑直接乱成一锅粥,锅都甩不掉。
而贴心的 IDEA 编辑器也为我们提示出了警告:

翻译一下就是:
使用了大写的“YYYY”(周年)模式:可能原本是想用“yyyy”(年份)!
肯定有兄弟疑惑:不都是表示年份吗?大小写差别咋这么大?
其实 Java 的日期格式化里,大小写真不是随便写的,二者完全不互通,混着用必出问题:
通过日历可以看到,从2026年12月27日开始到31日结束,这几天都会被计算为下一年。

这坑最恶心的地方在于,平时测试根本查不出来,系统跑得比谁都稳。可一到年底跨年,直接原地翻车:
每一个都能让你加班到深夜,业务影响范围极广,细思极恐啊,然后到了1月1日又自动好了,谁懂啊?毕竟谁不想好好的和对象跨年呢!
所以紧急提醒所有 Java 程序员!赶紧自查你负责的项目代码,别等炸了才后悔!
打开你的开发工具,用全局搜索功能,把项目里的日期格式化代码全查一遍,重点找大写 YYYY 的坑,查到就立马换成小写 yyyy,提前排雷,避免年底背锅。
也别忘了把这个提醒转发给身边的开发搭子,一起排查隐患、规范写代码,别因为一个小细节栽跟头,一起保住头发、稳住系统!