SimpleDateFormat 是 Java 中用于 Date 与字符串互转的非线程安全类,需指定模式字符串(如 "yyyy-MM-dd HH:mm:ss"),注意大小写敏感、引号转义及时区/语言环境配置,推荐高并发下使用 DateTimeFormatter 或 ThreadLocal 包装。

SimpleDateFormat 是 Java 中用来将 Date 对象格式化为字符串(或反之)的常用类。它通过指定模式字符串(pattern)来定义日期时间的显示样式。
创建 SimpleDateFormat 实例并设置模式
你需要先定义一个符合需求的模式字符串,比如 "yyyy-MM-dd HH:mm:ss" 表示“年-月-日 时:分:秒”。然后用该模式构造 SimpleDateFormat 对象:
- 模式中大小写敏感:
yyyy表示4位年份,yy表示2位;MM是月份(01–12),mm是分钟 - 常见符号:
dd(日)、HH(24小时制)、hh(12小时制)、ss(秒)、S(毫秒) - 中文环境可加文字,如
"yyyy年MM月dd日 HH:mm:ss",但需注意引号转义(单引号包裹文字)
调用 format() 方法转换 Date 为字符串
有了实例后,直接调用 format(Date date) 即可获得格式化后的字符串:
- 示例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(new Date()); // 输出类似 "2024-05-20 14:30:25" - 注意:
format()返回的是String,不是StringBuilder或其他类型 - 如果传入
null,会抛出NullPointerException
线程安全问题必须注意
SimpleDateFormat 不是线程安全的。多个线程共用同一个实例可能导致格式化结果错乱或异常:
立即学习“Java免费学习笔记(深入)”;
- 推荐做法:方法内局部创建(适合低频调用)
- 高频场景可用
ThreadLocal<SimpleDateFormat>或改用 Java 8 的DateTimeFormatter(不可变、线程安全) - 避免在工具类中定义 static 的
SimpleDateFormat字段(除非加锁或用 ThreadLocal 包装)
处理异常和时区(可选但实用)
虽然 format() 不抛检查异常,但 parse() 会抛 ParseException;另外,默认使用 JVM 本地时区:
- 如需固定时区,调用
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8")) - 若要兼容不同语言环境(如星期/月份名称),可传入
Locale构造器,例如new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA) - Java 8+ 更建议用
DateTimeFormatter配合LocalDateTime或ZonedDateTime,更现代、安全、灵活


















