
本文详解 Java 中使用 SimpleDateFormat 转换日期字符串的正确方法,指出常见大小写与字母含义误区(如 MMM 表示月份缩写,mm 表示分钟),并提供可运行的修复代码与现代替代方案(java.time)。
本文详解 java 中使用 simpledateformat 转换日期字符串的正确方法,指出常见大小写与字母含义误区(如 `mmm` 表示月份缩写,`mm` 表示分钟),并提供可运行的修复代码与现代替代方案(java.time)。
在 Java 中将一种日期格式的字符串转换为另一种格式,核心步骤是:先解析(parse)原始字符串为日期对象,再格式化(format)为新字符串。但实践中极易因日期模式(pattern)中字母大小写错误导致 ParseException——正如示例中 "05-Apr-23" 解析失败,根本原因在于模式串 dd-mmm-yy 使用了错误的占位符。
? 关键误区解析:大小写决定语义
SimpleDateFormat 中,字母大小写严格区分含义:
- M(大写)表示 月份(MM → 两位数字月,MMM → 英文缩写如 "Apr",MMMM → 全称如 "April")
- m(小写)表示 分钟(mm → 分钟,与日期无关)
因此,原代码中:
SimpleDateFormat sdf = new SimpleDateFormat("dd-mmm-yy"); // ❌ 错误:mmm 被解释为“分钟+分钟+分钟”
SimpleDateFormat sdf1 = new SimpleDateFormat("dd/mm/yy"); // ❌ 错误:mm 是分钟,非月份
应修正为:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy"); // ✅ MMM 匹配 "Apr"
SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yy"); // ✅ MM 表示月份数字
✅ 修复后的完整代码(Java 8 之前)
String oldDate = "05-Apr-23";
SimpleDateFormat parser = new SimpleDateFormat("dd-MMM-yy");
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy");
try {
Date parsedDate = parser.parse(oldDate); // 解析为 Date 对象
String newDateStr = formatter.format(parsedDate); // 格式化为新字符串
System.out.println(newDateStr); // 输出:05/04/23
return newDateStr;
} catch (ParseException e) {
throw new RuntimeException("Invalid date format: " + oldDate, e);
}
⚠️ 注意事项
-
区域设置(Locale)敏感:MMM 默认依赖 JVM 默认 Locale。若需确保英文月份(如 "Apr"),显式指定 Locale.ENGLISH:
SimpleDateFormat parser = new SimpleDateFormat("dd-MMM-yy", Locale.ENGLISH); - 线程不安全:SimpleDateFormat 非线程安全,多线程环境建议每次创建新实例,或使用 ThreadLocal 封装,或优先采用 java.time。
- 返回对象:务必调用 formatter.format(...),而非误写为 sdf.format(...)(原文答案中提及的“return sdf1 not sdf”实为笔误,应为 return sdf1.format(dt))。
? 推荐:使用现代 java.time API(Java 8+)
SimpleDateFormat 已被 java.time 类型取代,更安全、清晰且线程安全:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
String oldDate = "05-Apr-23";
// 解析:使用预定义英文Locale的模式
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(oldDate, inputFormatter);
// 格式化
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yy");
String newDateStr = date.format(outputFormatter); // 输出:05/04/23
System.out.println(newDateStr);
✅ 总结
- 日期模式中:M = 月份,m = 分钟;MMM 匹配英文缩写月份(需注意 Locale);
- 始终验证模式字符串与输入数据严格匹配;
- 优先选用 java.time(LocalDate/DateTimeFormatter),避免 SimpleDateFormat 的线程与维护风险;
- 生产环境务必添加异常处理与明确的错误提示,便于问题定位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











