译: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/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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,639评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,093评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,079评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,329评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,343评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,047评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,645评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,565评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,201评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,338评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,014评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,701评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,194评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,685评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,345评论 2 358

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,201评论 1 44
  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,353评论 1 31
  • 文/陈曼可 孤独不是寂寞,更多的是感知自己内心的时光。 即便身边有一群人,可是没有谁真的把目光投向你。 因为每个人...
    陈曼可CMK阅读 310评论 0 1
  • 请问自己5个以上有关自控力的问题。比如: 如果自控力满分是10分的话,你可以给自己打几分? 3分 当下在什么事情上...
    邹赫Natalie阅读 352评论 5 2
  • 20150829—一句 Good friends, good books, and a sleepy consci...
    RainyCai阅读 265评论 0 1