我有一个标准的ISO 8601格式的日期/时间值,例如2010-07-26T11:37:52Z。
我想要以26-jul-2010 (dd-mon-yyyy)格式显示日期。我该怎么做?
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;
}
Z
表示偏移量为零,但你将日期时间解析到了 JVM 的时区中,导致时间不正确。如果你不使用时间,根据你的具体需求,在许多情况下你将得到所需的输出。 - Ole V.V.Z
意味着“忽略此文本”。但是,这段文本是有价值的信息!Z
发音为“祖鲁”,表示与 UTC 相同的零小时-分钟-秒的偏移量。因此,这个答案在没有充分理由的情况下丢弃了重要信息。此外,这个答案未能解决时区的重要问题。如果在东京查看,UTC 中的那一刻可能是另一个日期,“明天”,而在蒙特利尔查看则可能是“昨天”。请参见 Ole V.V. 的正确答案。 - Basil Bourquejava.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的日期时间类现在已经过时,被java.time类所取代。大部分java.time功能已经在ThreeTen-Backport项目中向Java 6和Java 7进行了回溯。而ThreeTenABP则进一步适用于早期的Android (<26)。请参阅如何使用ThreeTenABP…。 - Basil Bourque我提供现代的解决方案。没有人应该再使用SimpleDateFormat
了。
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。只有当您需要输出字符串时,才将您的日期格式化为一个字符串。
OffsetDateTime.parse("2010-07-26T11:37:52Z").format(DateTimeFormatter.ofPattern("dd-MMM-uuuu"))
。 - Ole V.V.