使用Java进行日期格式转换

6

我有一个标准的ISO 8601格式的日期/时间值,例如2010-07-26T11:37:52Z

我想要以26-jul-2010 (dd-mon-yyyy)格式显示日期。我该怎么做?


1
现代方式:OffsetDateTime.parse("2010-07-26T11:37:52Z").format(DateTimeFormatter.ofPattern("dd-MMM-uuuu")) - Ole V.V.
3个回答

23
构造两个 SimpleDateFormat 对象。第一个对象用于将文本解析为 Date 对象,第二个对象用于将 Date 对象转换为字符串,例如:
try {
  DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  DateFormat df2 = new SimpleDateFormat("dd-MMM-yyyy");
  return df2.format(df1.parse(input));
}
catch (ParseException e) {
  return null;
}

解析可能会抛出ParseException异常,因此您需要捕获并处理该异常。

它正常运行了...非常感谢您的快速回答,让我的生活变得更美好。 - Paresh Mayani
1
虽然它可能会给你想要的结果,但实际上是错误的。Z 表示偏移量为零,但你将日期时间解析到了 JVM 的时区中,导致时间不正确。如果你不使用时间,根据你的具体需求,在许多情况下你将得到所需的输出。 - Ole V.V.
正如 Ole V.V. 所评论的那样,这个答案是错误的。单引号周围的 Z 意味着“忽略此文本”。但是,这段文本是有价值的信息!Z 发音为“祖鲁”,表示与 UTC 相同的零小时-分钟-秒的偏移量。因此,这个答案在没有充分理由的情况下丢弃了重要信息。此外,这个答案未能解决时区的重要问题。如果在东京查看,UTC 中的那一刻可能是另一个日期,“明天”,而在蒙特利尔查看则可能是“昨天”。请参见 Ole V.V. 的正确答案 - Basil Bourque

3

请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的日期时间类现在已经过时,被java.time类所取代。大部分java.time功能已经在ThreeTen-Backport项目中向Java 6和Java 7进行了回溯。而ThreeTenABP则进一步适用于早期的Android (<26)。请参阅如何使用ThreeTenABP… - Basil Bourque

1

我提供现代的解决方案。没有人应该再使用SimpleDateFormat了。

java.time

解析文本。
    String dateTimeValue = "2010-07-26T11:37:52Z";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeValue);

生成文本。
    DateTimeFormatter dateFormatter = 
        DateTimeFormatter.ofPattern(
            "dd-MMM-uuuu", 
            Locale.forLanguageTag("pt-BR")
        );
    String wantedFormattedDate = dateTime.format(dateFormatter);

输出:

    System.out.println(wantedFormattedDate);

2010年7月26日

输出中的月份缩写取决于提供的语言环境(例如我的示例为巴西葡萄牙语)。

我利用了您的日期时间采用 ISO 8601 格式,这是 java.time 类的默认解析格式(也是打印格式),即没有任何明确的格式化器。

避免使用其他答案中使用的 SimpleDateFormat 类。该类出了名的麻烦且已经过时。

通常情况下,您不希望将一个字符串格式的日期和时间转换为另一种格式的字符串。在程序中将日期和时间保留为日期时间对象,例如 Instant 或 OffsetDateTime。只有当您需要输出字符串时,才将您的日期格式化为一个字符串。

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接