美文网首页
译:Java.util.Date 转为 String

译:Java.util.Date 转为 String

作者: QZzzzzzzzz | 来源:发表于2018-09-29 17:10 被阅读15次

    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/TimeAPI的更多细节,请参看这篇教程

    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.Datejava.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.Datejava.util.Calendar类,以及相应的日期格式类。

    然后我们使用了Formatter类,最后使用了 Java 8 的 Date/Time API。

    像往常一样,完整的源代码放在GitHub

    相关文章

      网友评论

          本文标题:译:Java.util.Date 转为 String

          本文链接:https://www.haomeiwen.com/subject/wejboftx.html