Java SimpleDateFormat案例怎么用:从入门到实战的完整指南
目录导读
-
SimpleDateFormat是什么?为什么需要它?

-
基础用法:快速上手格式化与解析
-
常用日期时间模式符号详解
-
实战案例:日期格式化与字符串解析
-
常见陷阱:线程安全与性能问题
-
问答环节:开发者最常问的5个问题
-
替代方案:Java 8+ 推荐使用DateTimeFormatter
SimpleDateFormat是什么?为什么需要它?
SimpleDateFormat 是Java中用于日期时间格式化(Date → String)和解析(String → Date)的核心工具类,位于 java.text 包下,它允许开发者通过自定义模式字符串(如 "yyyy-MM-dd HH:mm:ss")来灵活控制日期时间的显示与读取。
为什么需要它?
在实际开发中,用户输入或数据库存储的日期通常以字符串形式存在,而Java程序内部需要使用 Date 或 Calendar 对象进行处理,SimpleDateFormat架起了这两者之间的桥梁,是Java日期处理的基础组件之一。
基础用法:快速上手格式化与解析
1 格式化(Date → String)
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatExample {
public static void main(String[] args) {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = sdf.format(now);
System.out.println(formatted); // 输出如:2025-04-12 14:30:00
}
}
2 解析(String → Date)
import java.text.SimpleDateFormat;
import java.util.Date;
public class ParseExample {
public static void main(String[] args) throws Exception {
String dateStr = "2025-04-12 14:30:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsedDate = sdf.parse(dateStr);
System.out.println(parsedDate); // 输出如:Sat Apr 12 14:30:00 CST 2025
}
}
注意:解析时必须处理 ParseException 异常。
常用日期时间模式符号详解
模式符号是SimpleDateFormat的核心,以下是开发者最常用的字符:
| 符号 | 含义 | 示例(输出:2025-04-12 14:05:03) |
|---|---|---|
| yyyy | 年份(4位) | 2025 |
| MM | 月份(2位) | 04 |
| dd | 日期(2位) | 12 |
| HH | 小时(0-23) | 14 |
| mm | 分钟(2位) | 05 |
| ss | 秒(2位) | 03 |
| SSS | 毫秒(3位) | 123 |
| E | 星期几简写 | 周六 |
| a | AM/PM标记 | PM |
实际案例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd E HH:mm:ss.SSS a");
// 输出:2025/04/12 周六 14:05:03.123 PM
实战案例:日期格式化与字符串解析
案例1:从用户输入的字符串解析日期
import java.text.SimpleDateFormat;
import java.util.Date;
public class UserInputParse {
public static void main(String[] args) {
String userInput = "2025-04-12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(userInput);
System.out.println("解析成功:" + date);
} catch (Exception e) {
System.out.println("解析失败,请检查日期格式。");
}
}
}
案例2:数据库日期格式转换
假设数据库日期字段为 DateTime 类型,你需要将 Date 格式化为特定字符串用于API返回:
Date dbDate = new Date();
SimpleDateFormat apiFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
// 输出:2025-04-12T14:30:00.123+0800
案例3:带时区处理(高级)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
// 输出:2025-04-12 02:30:00 EDT
常见陷阱:线程安全与性能问题
陷阱1:线程不安全
SimpleDateFormat 是非线程安全的,在多线程环境中,如果多个线程共享同一个实例,会导致解析结果错误甚至抛异常。
错误示例(多线程下异常):
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 多个线程同时调用 sdf.parse() 或 sdf.format()
解决办法:
- 每次使用时创建新实例
- 使用
ThreadLocal包装 - 或加锁同步
推荐方案(ThreadLocal):
private static final ThreadLocal<SimpleDateFormat> dateFormatHolder =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
陷阱2:模式字符大小写敏感
MM(月份) vsmm(分钟),写错会导致解析错误dd(日期) vsDD(一年中的第几天),新手容易混淆
陷阱3:宽容解析
SimpleDateFormat 默认是宽松模式(setLenient(true)),可能接受非法日期如 2025-02-30(会自动修正为3月2日),建议设置 setLenient(false) 来严格校验。
问答环节:开发者最常问的5个问题
Q1:SimpleDateFormat可以格式化毫秒吗?
可以,使用模式 SSS,"yyyy-MM-dd HH:mm:ss.SSS"。
Q2:为什么我的解析抛出ParseException?
常见原因:
- 模式字符串与实际字符串格式不匹配(例如漏了空格、冒号)
- 月份用
MM而实际输入是单月(如4而非04) - 时区符号错误
建议使用 setLenient(false) 先做严格校验。
Q3:SimpleDateFormat和DateTimeFormatter哪个更好?
如果你的项目基于 Java 8 及以上,强烈推荐使用 DateTimeFormatter,它:
- 线程安全(不可变类)
- 支持更多时区和日期API(
LocalDateTime、ZonedDateTime) - 性能更优
Q4:如何格式化当前时间为 “2025年04月12日 14:30:00 星期六” 格式?
模式字符串:"yyyy年MM月dd日 HH:mm:ss E"
Q5:SimpleDateFormat能处理UTC时间吗?
可以,通过设置时区:
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
替代方案:Java 8+ 推荐使用DateTimeFormatter
从 Java 8 开始,官方引入新的日期时间API(java.time 包),DateTimeFormatter 是 SimpleDateFormat 的现代替代者。
DateTimeFormatter 示例:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
System.out.println(formatted); // 输出:2025-04-12 14:30:00
// 解析
String dateStr = "2025-04-12 14:30:00";
LocalDateTime parsed = LocalDateTime.parse(dateStr, formatter);
System.out.println(parsed);
}
}
核心优点:
- 线程安全,不可变
- 自动处理常见问题(如时区、日期校验)
- 与
java.time完全集成
SimpleDateFormat作为Java早期日期处理的核心类,能够满足大部分格式化与解析需求,但在多线程环境下需特别注意其线程安全问题,对于新项目或 Java 8+ 环境,建议优先使用 DateTimeFormatter,以获得更好的性能和安全性,无论选择哪种工具,理解日期模式符号的含义、注意时区与宽容模式,都是避免踩坑的关键。