1. 概述
在本教程中,我们将介绍如何将 Java 中的 Date
对象转换为 String
。我们会同时使用传统的 java.util.Date
类型和 Java 8 引入的新版日期时间 API 来进行演示。
如果你更关心反向操作(即从 String
转换为 Date
),可以参考 这篇文章。
关于 Java 8 新版日期时间 API 的更多细节,请查看 这篇相关教程。
2. 将 java.util.Date
转换为 String
虽然在 Java 8 及以后我们推荐使用新的日期时间 API,但在某些场景下我们仍然不得不处理 java.util.Date
对象(例如第三方库返回的是旧版 Date
)。
下面是一些常见的转换方式。
2.1. 准备一个 Date
对象
我们先定义期望的字符串格式以及日期模式:
private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM";
private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";
接着创建一个实际的 Date
实例,这里通过 Calendar
来构造:
TimeZone.setDefault(TimeZone.getTimeZone("CET"));
Calendar calendar = Calendar.getInstance();
calendar.set(2018, Calendar.AUGUST, 1, 12, 0);
Date date = calendar.getTime();
设置默认时区为 CET 是为了避免后续使用新 API 时出现时区问题。需要注意的是:✅ Date
本身不包含时区信息,但其 toString()
方法会使用系统默认时区展示时间。
下面的所有示例都将基于这个 date
实例进行演示。
2.2. 使用 SimpleDateFormat
类
我们可以使用 SimpleDateFormat
的 format()
方法来完成转换:
DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
然后调用 format()
并验证结果是否符合预期:
String formattedDate = formatter.format(date);
assertEquals(EXPECTED_STRING_DATE, formattedDate);
2.3. 使用抽象类 DateFormat
其实 SimpleDateFormat
是继承自抽象类 DateFormat
的子类,它也提供了多种日期时间格式化方法。
我们可以这样实现相同的效果:
String formattedDate = DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(date);
这种方式传入了预设的样式参数:✅ 日期为 MEDIUM 格式,时间为 SHORT 格式。
3. 使用 Formatter
类
除了上面的方法,还可以使用 Formatter
类来实现一行代码转换,虽然可读性稍差,但它是线程安全的,适用于多线程环境 ❗(⚠️ SimpleDateFormat
非线程安全):
String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);
这里用了 %1$
表示所有标志都作用于第一个参数。详细的格式标志说明可以在 Formatter 官方文档 中找到。
4. 利用 Java 8 的日期时间 API 转换
Java 8 引入的 Date/Time API
功能强大得多,建议优先使用。接下来我们看看如何将 Date
转换为 String
。
首先定义格式器:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
由于新版 API 不直接支持 Date
,我们需要先将其转换为 Instant
:
Instant instant = date.toInstant();
再进一步转换为 LocalDateTime
(因为我们目标字符串包含日期和时间):
LocalDateTime ldt = instant
.atZone(ZoneId.of("CET"))
.toLocalDateTime();
最后就可以轻松格式化输出:
String formattedDate = ldt.format(formatter);
5. 总结
本文介绍了几种将 java.util.Date
转换为 String
的方式:
- 使用传统的
SimpleDateFormat
和DateFormat
- 使用
Formatter
实现简洁的一行转换 - 推荐使用 Java 8 的
DateTimeFormatter
与新版日期时间 API
源码已上传至 GitHub。