SimpleDateFormat 线程不安全,别在多线程里复用同一个实例
直接把 SimpleDateFormat 声明为 static 变量,在并发场景下(比如 Spring 的 service 方法里反复调用)会导致格式化结果错乱,甚至抛出 java.lang.ArrayIndexOutOfBoundsException 或返回错误时间。这不是偶发 bug,是类设计上就未同步内部状态(如 calendar 字段)。
实操建议:
- 每次使用都新建实例:开销不大,比修复线程问题成本低得多
- 用
ThreadLocal<simpledateformat></simpledateformat>缓存,但要注意内存泄漏风险(尤其在 Tomcat 等容器中未清理) - Java 8+ 强烈推荐换成
DateTimeFormatter(不可变、线程安全),例如:DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
pattern 字符大小写敏感,常见误写:大写 YYYY 和小写 yyyy 不等价
YYYY 是「基于周的年份」(week year),按 ISO 8601 规则计算,可能和日历年份不同。比如 2024-12-30 是周一,它属于 2025 年第 1 周,用 YYYY 会输出 2025;而 yyyy 才是常规日历年份,输出 2024。
其他易错点:
立即学习“Java免费学习笔记(深入)”;