✅ 一、Date
→ String
(格式化)
将 Date
对象格式化为 yyyy-MM-dd HH:mm:ss
格式的字符串。
✅ 操作步骤(非常详细)
- 导入必要的类
- 创建
SimpleDateFormat
实例,并指定格式 - 调用
format()
方法进行转换 - 输出或使用结果字符串
✅ 代码示例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateToStringExample {
public static void main(String[] args) {
// 1. 获取当前时间
Date now = new Date(); // 当前时间
// 2. 定义格式化器,指定格式 yyyy-MM-dd HH:mm:ss
// 注意:MM 是月份,mm 是分钟,HH 是24小时制小时
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
// 3. 格式化 Date 为字符串
String formattedDate = sdf.format(now);
// 4. 输出结果
System.out.println("格式化后的时间: " + formattedDate);
// 示例输出:2025-08-15 10:45:30
}
}
✅ 二、String
→ Date
(解析)
将格式为 yyyy-MM-dd HH:mm:ss
的字符串解析为 Date
对象。
✅ 操作步骤
- 准备一个符合格式的字符串
- 创建相同格式的
SimpleDateFormat
- 调用
parse()
方法 - 处理可能抛出的
ParseException
✅ 代码示例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class StringToDateExample {
public static void main(String[] args) {
// 1. 准备字符串
String dateString = "2025-08-15 10:45:30";
// 2. 创建格式化器(格式必须与字符串完全匹配)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
try {
// 3. 解析字符串为 Date 对象
Date parsedDate = sdf.parse(dateString);
// 4. 输出结果(默认 toString() 会显示完整时间)
System.out.println("解析后的 Date: " + parsedDate);
// 输出示例:Fri Aug 15 10:45:30 CST 2025
} catch (ParseException e) {
System.err.println("日期解析失败:字符串格式不匹配");
e.printStackTrace();
}
}
}
⚠️ 常见错误与注意事项
问题 | 说明 | 解决方案 |
---|---|---|
格式不匹配 | 字符串是 2025/08/15 ,但格式写成 - 会失败 |
确保 SimpleDateFormat 的模式与字符串完全一致 |
大小写错误 | hh (12小时制)vs HH (24小时制),mm (分钟)vs MM (月份) |
记住:HH 表示24小时,mm 表示分钟,ss 表示秒 |
未处理异常 | parse() 抛出 ParseException |
必须用 try-catch 包裹 |
线程不安全 | SimpleDateFormat 不是线程安全的 |
不要在多线程中共享同一个实例 |
🛡️ 最佳实践:线程安全方案
由于 SimpleDateFormat
不是线程安全的,在高并发场景下(如 Web 服务)共享它会导致数据错乱。
✅ 推荐做法 1:使用 ThreadLocal
private static final ThreadLocal<SimpleDateFormat> DATE_FORMATTER =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 使用
public String format(Date date) {
return DATE_FORMATTER.get().format(date);
}
public Date parse(String dateString) throws ParseException {
return DATE_FORMATTER.get().parse(dateString);
}
✅ 推荐做法 2:使用 Java 8+ 的 DateTimeFormatter
(强烈推荐)
✅ 线程安全 ✅ 更现代 ✅ 性能更好
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
// 1. Date -> String
Date date = new Date();
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = ldt.format(formatter);
// 2. String -> Date
String str = "2025-08-15 10:45:30";
LocalDateTime ldt2 = LocalDateTime.parse(str, formatter);
Date resultDate = java.util.Date.from(ldt2.atZone(ZoneId.systemDefault()).toInstant());
📌 总结:快速掌握要点
转换方向 | 方法 | 关键代码 |
---|---|---|
Date → String |
sdf.format(date) |
"yyyy-MM-dd HH:mm:ss" |
String → Date |
sdf.parse(str) |
必须 try-catch |
推荐替代方案 | java.time.LocalDateTime + DateTimeFormatter |
线程安全、更清晰 |
✅ 一句话记住格式:
yyyy-MM-dd HH:mm:ss
y
=年,M
=月,d
=日H
=小时(24小时制),m
=分钟,s
=秒- 连字符
-
和冒号:
是分隔符,必须匹配