求你了,别用 YYYY-MM-dd!

昨天下午看同事提交的代码,扫到这么一行,心里顿时咯噔一下:
new SimpleDateFormat("YYYY-MM-dd")

很多人敲代码顺手,或者被代码补全带偏,喜欢把 Y 和 M 全大写。但这在 Java 里,等于给系统埋了一颗隐蔽性极强的"跨年雷",年底必炸。

为了预现场景,我构建了一段伪代码,故意把时间设置到了 2026 年 12 月 31 日:

java 复制代码
1234567891011121314151617181920import 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));
    }
}

运行结果:

yaml 复制代码
12小写 yyyy: 2026-12-31
大写 YYYY: 2027-12-31  // 注意看,年份直接错乱了

发现没?原本是 2026 年的日期,用大写的 YYYY 格式化后,直接变成了 2027 年!

为什么会这样?

Java 的日期格式化标准里,大小写不同,意思完全不一样:

  • 小写 yyyy:代表真实的日历年份,也就是你日历上看到的那一年。
  • 大写 YYYY:代表的是 Week-Based-Year(基于周的年份)。简单来说,只要这一周跨年了------比如这周既有 2026 年底的几天,又包含了 2025 年的 1 月 1 日------那这周里的任何一天,年份都会被算作下一年。

这代码最恶心的地方就在这:平时测试根本发现不了,一切正常。只有到了每年最后那几天才会突然出问题,试想一下:用户的登录 Token 会因为「签发时间在未来」被集体拦截导致大面积掉线、扔进 MQ 的延迟消息也直接排到了下一年......细思恐极了朋友!

赶紧自查!

今天抽空打开 IDEA,按下 Ctrl + Shift + F(Mac 是 Cmd + Shift + F),全局搜一下 "YYYY(记得带上前引号)。如果真搜到了,赶紧改成 yyyy,算是提前排了个大雷。

顺手把这篇文章丢到团队群里,让大家都自查一下,能救一个是一个。

相关推荐
guodingdingh19 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯2 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城6 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu