- 传统方法:使用
SimpleDateFormat(Java 8 之前) - 现代方法:使用
java.time包 (Java 8 及以上,推荐)
下面我将详细介绍这两种方法,并提供完整的代码示例。

使用 SimpleDateFormat (传统方法)
SimpleDateFormat 是一个具体的类,用于以区域设置敏感的方式格式化和解析日期,它定义了如何将日期/时间对象转换为字符串(格式化),以及如何将字符串转换回日期/时间对象(解析)。
核心步骤:
- 创建
SimpleDateFormat的实例,并传入你想要的日期格式字符串。 - 调用
format()方法,将Date对象作为参数传入,该方法会返回格式化后的String。
常用格式化字符:
| 字符 | 含义 | 示例 |
|---|---|---|
y |
年 | yyyy (2025), yy (23) |
M |
月 | MM (09), M (9) |
d |
日 | dd (05), d (5) |
H |
小时 (24小时制) | HH (14) |
h |
小时 (12小时制) | hh (02) |
m |
分钟 | mm (05) |
s |
秒 | ss (09) |
S |
毫秒 | SSS (123) |
E |
星期几 | EEE (Wed) |
z |
时区 | z (GMT+08:00) |
代码示例:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateToStringSimpleDateFormat {
public static void main(String[] args) {
// 1. 获取当前的 Date 对象
Date now = new Date();
System.out.println("原始 Date 对象: " + now);
// 2. 定义几种常见的日期格式
// 格式1: yyyy-MM-dd ( 2025-10-27)
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String strDate1 = sdf1.format(now);
System.out.println("格式1 (yyyy-MM-dd): " + strDate1);
// 格式2: yyyy/MM/dd HH:mm:ss ( 2025/10/27 14:30:55)
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String strDate2 = sdf2.format(now);
System.out.println("格式2 (yyyy/MM/dd HH:mm:ss): " + strDate2);
// 格式3: yyyy年MM月dd日 HH时mm分ss秒 (中文格式)
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String strDate3 = sdf3.format(now);
System.out.println("格式3 (中文格式): " + strDate3);
// 格式4: EEE, MMM d, yyyy ( Fri, Oct 27, 2025)
SimpleDateFormat sdf4 = new SimpleDateFormat("EEE, MMM d, yyyy");
String strDate4 = sdf4.format(now);
System.out.println("格式4 (EEE, MMM d, yyyy): " + strDate4);
}
}
注意事项 (非常重要!):
SimpleDateFormat 不是线程安全的,如果在多线程环境下共享同一个 SimpleDateFormat 实例,可能会导致程序出错或产生不可预期的结果,最佳实践是在每次使用时都创建一个新的实例,或者使用 ThreadLocal 来为每个线程维护一个实例。
使用 java.time 包 (现代方法,推荐)
从 Java 8 开始,Java 引入了全新的 java.time 包,它提供了更强大、更易用、更线程安全的日期和时间 API,这是目前处理日期和时间的标准方式。
Date 对象本质上是包含一个 long 类型的时间戳(自 1970-01-01 00:00:00 UTC以来的毫秒数),我们需要先将其转换为 java.time 中的类,然后再进行格式化。

核心步骤:
- 将
java.util.Date转换为java.time.Instant。Instant是一个时间线上的点,可以看作是Date的现代替代品。 - 将
Instant转换为java.time.ZonedDateTime或java.time.LocalDateTime。ZonedDateTime包含时区信息,而LocalDateTime不包含。 - 使用
java.time.format.DateTimeFormatter来定义格式。 - 调用
format()方法进行格式化。
代码示例:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class DateToStringJavaTime {
public static void main(String[] args) {
// 1. 获取当前的 Date 对象
Date now = new Date();
System.out.println("原始 Date 对象: " + now);
// 2. 将 Date 转换为 Instant
Instant instant = now.toInstant();
// 3. 将 Instant 转换为 ZonedDateTime (带有时区信息)
// 使用系统默认时区
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
System.out.println("ZonedDateTime (系统默认时区): " + zonedDateTime);
// 4. 定义 DateTimeFormatter
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
String strDate1 = zonedDateTime.format(formatter1);
System.out.println("格式化后 (带时区): " + strDate1);
// 5. 如果不需要时区信息,可以转换为 LocalDateTime
LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String strDate2 = localDateTime.format(formatter2);
System.out.println("格式化后 (无时区): " + strDate2);
// 6. 另一种转换方式:直接从 Date 转换为 LocalDateTime
// 这会使用 JVM 的默认时区,结果可能与上面的 ZonedDateTime 转换不同
LocalDateTime localDateTimeFromLegacy = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println("从 Date 直接转换的 LocalDateTime: " + localDateTimeFromLegacy);
}
}
java.time 的优势:
- 线程安全:
DateTimeFormatter和其他java.time类都是不可变的(immutable),因此是线程安全的,可以在任何地方安全地共享。 - API 设计更优秀:方法命名清晰,逻辑更直观。
- 功能更强大:提供了更丰富的日期和时间计算方法。
- 解决了
Date和Calendar的许多设计缺陷。
总结与对比
| 特性 | SimpleDateFormat |
java.time (DateTimeFormatter) |
|---|---|---|
| Java 版本 | Java 1.1 及以上 | Java 8 及以上 (推荐) |
| 线程安全 | 不安全 | 安全 (不可变) |
| 易用性 | API 略显陈旧 | API 更现代、更直观 |
| 功能 | 基本格式化 | 功能强大,支持复杂的日期时间计算 |
| 转换 | 直接格式化 Date |
需先将 Date 转为 Instant,再转为 ZonedDateTime 或 LocalDateTime |
- 如果你正在使用 Java 8 或更高版本,强烈建议使用
java.time包,它是未来,更安全、更强大。 - 如果你必须在旧版 Java (Java 7 或更早) 项目中工作,
SimpleDateFormat是唯一的选择,请务必注意线程安全问题,每次使用都新建实例。

