译:Java.util.Date 转为 String
在http://www.spring4all.com上翻译了一篇小文章,仅作纪念。
Java.util.Date 转为 String
原文链接:https://www.baeldung.com/java-util-date-to-string
作者:baeldung
译者:QZ
1. 概述
在这个指南中,我们将展示在Java中如何把Date
对象转为String
对象。要实现这个目标,我们不但使用老式的 java.util.Date
类型,而且也使用Java 8新引入的Date/Time
API。
如果你想学习相反的转换,例如从String
转为Date
类型,你可以查看这篇教程。
关于新的Date/Time
API的更多细节,请参看这篇教程。
2. 把 java.util.Date
转为String
尽管在 Java 8 中,我们不应使用java.util.Date
,但有时也无法避免(例如,我们从不受自己控制的类库中接收到Date
对象)。
在这种情况下,我们有多种把java.util.Date
转换为String
的方式可以选择。
2.1 准备Date
对象
我们首先声明一个日期的预期String
表示,并定义一个期望的日期格式:
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
作为默认的TimeZone
,防止稍后使用新的API时出现问题。应该注意Date
本身没有时区,但它的toString()
方法使用当前的默认时区。
我们将在下面的所有例子中使用这个Date
实例。
2.2. 使用SimpleDateFormat
类
在这个例子中,我们使用SimpleDateFormat
类的format()
方法。我们使用之前的日期格式创建它的实例:
DateFormat formatter = new SimpleDateFormat(DATE_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);
使用这个方法,我们可以传入风格模式(style patterns) — 这个例子中是MEDIUM
格式的日期和SHORT
格式的时间。
3. 使用Formatter
类
另一个简单的方法是,使用Formatter
类获取跟前面例子同样的输出。
不过这种方法可读性不好,它是线程安全的单行调用,这是它的优点,特别是在多线程环境中(我们应该记住SimpleDateFormat
不是线程安全的)
String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);
我们使用1$
表明在每个标记处仅传递1个参数。标记的详细描述在Formatter
类的Date/Time 转换部分。
4. 使用 Java 8 Date/Time API
Java 8 的Date/Time
API 比java.util.Date
和 java.util.Calendar
类都要更强大,我们应该尽可能使用它。我们看下如何使用它把给定的Date
对象转换为String
。
这次我们使用DateTimeFormatter
类和它的format()
方法,以及和之前 2.1 部分同样的日期格式:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
为了使用新的 API,我们需要把Date
对象转换为Instant
对象
Instant instant = date.toInstant();
因为我们预期的String
有日期和时间两部分,我们还需要把Instant
对象转为LocalDateTime
:
LocalDateTime ldt = instant
.atZone(ZoneId.of("CET"))
.toLocalDateTime();
最后,就可以很容易地得到格式化的String
:
String formattedDate = ldt.format(formatter);
5. 总结
在这篇文章里,我们举例说明了几种把java.util.Date
对象转换为String
的方法。我们首先展示了如何使用老式的java.util.Date
和 java.util.Calendar
类,以及相应的日期格式类。
然后我们使用了Formatter
类,最后使用了 Java 8 的 Date/Time API。
像往常一样,完整的源代码放在GitHub。