java中date与simpledateformat用于日期格式化和解析,但非线程安全且需严格模式匹配;java 8+推荐使用线程安全、功能更丰富的java.time api。

Java 中的 Date 类和 SimpleDateFormat 是早期处理日期格式化与解析的常用组合,虽在 Java 8 后推荐使用 java.time(如 LocalDateTime、DateTimeFormatter),但在维护老项目或 JDK 版本较低时仍需掌握。
创建 Date 对象并转为指定字符串格式
用 SimpleDateFormat 将 Date 转成可读字符串,关键在于模式字符串(pattern)与线程安全性:
- 模式字母大小写敏感,例如
"yyyy-MM-dd HH:mm:ss"表示 2024-05-20 14:30:45 -
SimpleDateFormat不是线程安全的,多线程环境下应避免复用同一实例,建议每次新建或用ThreadLocal封装 - 示例代码:
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
String formatted = sdf.format(now); // 如:2024年05月20日 14:30
将字符串解析为 Date 对象
用 parse() 方法反向操作,需注意异常处理和模式严格匹配:
- 必须捕获
ParseException - 输入字符串必须完全符合 pattern,多一个空格或少一位年份都会报错
- 默认不支持时区,若字符串含时区(如 "2024-05-20 14:30:00 CST"),需显式设置
sdf.setTimeZone(TimeZone.getTimeZone("CST"))
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = sdf.parse("2024-05-20 14:30:45");
} catch (ParseException e) {
e.printStackTrace();
}
常见模式字母含义与注意事项
熟悉 pattern 规则才能准确控制输出/输入格式:
-
y:年份(yy→ 24,yyyy→ 2024) -
M:月份(M→ 1~12,MM→ 01~12,MMM→ Jan,MMMM→ January) -
d:月中的日(d→ 1~31,dd→ 01~31) -
H:24 小时制小时(H→ 0~23,HH→ 00~23);h是 12 小时制(1~12) -
m:分钟,s:秒,均需小写 - 中文字符(如“年”“月”“日”)直接写在 pattern 中即可,无需转义
替代方案建议(Java 8+)
若项目允许升级,优先使用 java.time API:
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))LocalDateTime.parse("2024-05-20 14:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))- 线程安全、不可变、语义清晰,且天然支持时区(
ZonedDateTime)和本地化(DateTimeFormatter.ofLocalizedDateTime)










