在Java开发中,日期格式化是非常常见的需求,SimpleDateFormat作为java.text包下的日期格式化工具,能够方便地实现Date对象和字符串之间的相互转换。下面我们详细介绍它的具体使用方法。

SimpleDateFormat的基本使用
SimpleDateFormat继承了DateFormat类,我们可以通过构造方法传入指定的日期格式模板来创建实例,然后使用它的format()方法将Date对象转为字符串,使用parse()方法将字符串转为Date对象。
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) {
// 创建SimpleDateFormat实例,指定日期格式模板
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 获取当前时间
Date now = new Date();
// 将Date对象格式化为指定格式的字符串
String dateStr = sdf.format(now);
System.out.println("格式化后的日期字符串:" + dateStr);
try {
// 将字符串解析为Date对象
Date parsedDate = sdf.parse("2024-05-20 14:30:00");
System.out.println("解析后的Date对象:" + parsedDate);
} catch (Exception e) {
e.printStackTrace();
}
}
}常见的日期格式符号
SimpleDateFormat通过特定的字符来表示日期的不同部分,以下是常用的格式符号说明:
| 符号 | 含义 | 示例 |
|---|---|---|
| y | 年,yyyy表示四位年份 | 2024 |
| M | 月,MM表示两位月份,M表示一位月份 | 05 / 5 |
| d | 日,dd表示两位日期 | 20 |
| H | 小时(24小时制),HH表示两位小时 | 14 |
| h | 小时(12小时制),hh表示两位小时 | 02 |
| m | 分钟,mm表示两位分钟 | 30 |
| s | 秒,ss表示两位秒数 | 45 |
| S | 毫秒,SSS表示三位毫秒 | 123 |
线程安全问题与解决方案
需要注意的是,SimpleDateFormat不是线程安全的类,它的内部使用了共享的Calendar实例,在多线程环境下并发调用format()或parse()方法会出现数据错乱的问题。
常见的解决方案有以下几种:
- 每次使用时创建新的SimpleDateFormat实例,适合调用频率不高的场景
- 使用ThreadLocal存储每个线程对应的SimpleDateFormat实例,避免线程间共享
- Java 8及以上版本可以使用java.time包下的DateTimeFormatter,它是线程安全的,推荐在新项目中使用
import java.text.SimpleDateFormat;
import java.util.Date;
public class ThreadLocalDateFormatDemo {
// 使用ThreadLocal存储每个线程的SimpleDateFormat实例
private static final ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static String formatDate(Date date) {
return dateFormatThreadLocal.get().format(date);
}
public static void main(String[] args) {
Date now = new Date();
System.out.println("线程安全的格式化结果:" + formatDate(now));
// 使用完后可以调用remove方法清除ThreadLocal中的值,避免内存泄漏
dateFormatThreadLocal.remove();
}
}使用注意事项
在使用SimpleDateFormat解析字符串时,如果字符串格式和模板不匹配,会抛出ParseException,因此需要在调用parse()方法时做好异常处理。另外,设置日期模板时要注意符号的大小写,比如M表示月份,m表示分钟,不要混淆导致格式化结果错误。
JavaSimpleDateFormat日期格式化DateFormat修改时间:2026-05-25 21:46:43