在Java开发中,日期格式化是常见的需求,SimpleDateFormat是处理日期格式转换的核心类之一,它可以将Date对象按照指定的格式转换为字符串,也可以将符合格式的字符串解析为Date对象。

SimpleDateFormat的基本用法
SimpleDateFormat位于java.text包下,使用前需要先创建实例并指定日期格式模板。常用的构造方法是传入一个格式字符串来初始化对象。
常用日期格式符号
格式模板中的字符有特定含义,常用的符号如下表所示:
| 符号 | 含义 | 示例 |
|---|---|---|
| y | 年 | yyyy表示四位年份,如2024 |
| M | 月 | MM表示两位月份,如03 |
| d | 日 | dd表示两位日期,如05 |
| H | 小时(24小时制) | HH表示两位小时,如14 |
| h | 小时(12小时制) | hh表示两位小时,如02 |
| m | 分钟 | mm表示两位分钟,如30 |
| s | 秒 | ss表示两位秒数,如45 |
| S | 毫秒 | SSS表示三位毫秒,如123 |
| E | 星期 | EEE表示星期缩写,如周一 |
Date转字符串示例
将当前时间按照指定格式转换为字符串的代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatDemo {
public static void main(String[] args) {
// 创建SimpleDateFormat实例,指定格式模板
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 获取当前时间
Date now = new Date();
// 格式化日期为字符串
String dateStr = sdf.format(now);
System.out.println("格式化后的日期字符串:" + dateStr);
}
}
上述代码运行后会输出类似2024-03-05 14:30:45的字符串,具体值根据当前时间变化。
字符串转Date示例
如果有一个符合格式的时间字符串,需要将其转换为Date对象,可以使用parse方法,代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateParseDemo {
public static void main(String[] args) throws Exception {
// 创建SimpleDateFormat实例,格式要和字符串匹配
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String dateStr = "2024/03/05";
// 解析字符串为Date对象
Date date = sdf.parse(dateStr);
System.out.println("解析后的Date对象:" + date);
}
}
需要注意的是,parse方法会抛出ParseException,实际开发中需要处理异常,要么抛出要么捕获。
使用注意事项
线程安全问题
SimpleDateFormat不是线程安全的类,它的内部包含了可变的 Calendar 实例,如果多个线程共享同一个SimpleDateFormat实例并同时调用format或parse方法,会出现数据错乱的问题。
如果是多线程场景,建议每个线程单独创建SimpleDateFormat实例,或者使用ThreadLocal来保存每个线程的实例,示例如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class ThreadLocalDateFormat {
// 使用ThreadLocal保存每个线程的SimpleDateFormat实例
private static final ThreadLocal<SimpleDateFormat> SDF_THREAD_LOCAL = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public static String format(Date date) {
return SDF_THREAD_LOCAL.get().format(date);
}
public static Date parse(String dateStr) throws Exception {
return SDF_THREAD_LOCAL.get().parse(dateStr);
}
}
格式模板匹配问题
使用parse方法时,字符串的格式必须和SimpleDateFormat构造时传入的模板完全匹配,否则会抛出解析异常。比如模板是yyyy-MM-dd,传入2024/03/05就会解析失败。
总结
SimpleDateFormat是Java中处理日期格式化的基础工具,掌握它的常用格式符号和转换方法就能满足大部分基础场景的需求。在使用时要注意线程安全问题和格式匹配问题,避免产生不必要的异常。如果需要更复杂的日期处理,也可以考虑Java 8之后引入的java.time包下的DateTimeFormatter类,它具备更好的线程安全性和更丰富的功能。
SimpleDateFormatJava日期格式化Date类日期格式符号修改时间:2026-06-16 03:21:24