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

我们可以使用 SimpleDateFormatformat() 方法来完成转换:

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 的方式:

  • 使用传统的 SimpleDateFormatDateFormat
  • 使用 Formatter 实现简洁的一行转换
  • 推荐使用 Java 8 的 DateTimeFormatter 与新版日期时间 API

源码已上传至 GitHub


原始标题:Convert java.util.Date to String