如何在 Scala 中将日期格式"2021-02-28 13:38:00.597+0000"
转换为"Mon, Feb 28,2021 15:25:00 UTC"
UTC 格式?
如果您使用的是 Java 8 之前的旧 Java 版本,最好使用 joda-time 中的 DateTimeFormat。顺便说一句,+0000
区域偏移量是针对 UTC 的,所以我本可以省略withZoneUTC()
,但为了安全起见,我仍然在第一次约会使用它:
val oldDateString = "2021-02-28 13:38:00.597+0000"
val OldFormat = "yyyy-MM-dd HH:mm:ss.SSSZ"
val NewFormat = "EEE, MMM dd, yyyy HH:mm:ss z"
val formatterOld = DateTimeFormat.forPattern(OldFormat)
val formatterNew = DateTimeFormat.forPattern(NewFormat)
val dt = formatterOld.withZoneUTC().parseDateTime(oldDateString)
val dateStringInUTC = formatterNew.withZoneUTC().print(dt)
println(dt) // 2021-02-28T13:38:00.597Z
println(dateStringInUTC) // Sun, Feb 28, 2021 13:38:00 UTC
更新:对于Java 8及更高版本,java.time API是你的朋友。同样,withZoneSameInstant(ZoneOffset.UTC)
也不是真正需要的:
val oldDateString = "2021-02-28 13:38:00.597+0000"
val OldFormat = "yyyy-MM-dd HH:mm:ss.SSSZZZ"
val NewFormat = "EEE, MMM dd, yyyy HH:mm:ss z"
val formatterOld = DateTimeFormatter.ofPattern(OldFormat)
val formatterNew = DateTimeFormatter.ofPattern(NewFormat)
val zdt = ZonedDateTime.parse(oldDateString, formatterOld)
val dateStringInUTC = zdt.withZoneSameInstant(ZoneId.of("UTC")).format(formatterNew)
println(zdt) // 2021-02-28T13:38:00.597Z
println(dateStringInUTC) // Sun, Feb 28, 2021 13:38:00 UTC
更新:切换到使用ZoneId.of("UTC")
而不是ZoneOffset.UTC
,因为后者不会在最后打印String
UTC
,即使ZoneOffset
扩展ZoneId
,如@deHaar所述。
如果你可以使用java.time
,你需要
- 一个
DateTimeFormatter
,用于使用输入示例的格式解析String
s,该格式非常接近 ISO 标准,但缺少日期和时间之间的'T'
- 另一种
DateTimeFormatter
,用于以所需格式输出时态内容,其中包括星期几和一年中月份的(英语)缩写 - 用于解析具有第一个
DateTimeFormatter
的String
的OffsetDateTime
- 以 UTC 为单位的时间值的
ZonedDateTime
这就是我在 Java 中的做法:
public static void main(String[] args) {
// example String
String utcDatetimeString = "2021-02-28 13:38:00.597+0000";
// prepare a formatter that can parse a String of this format
DateTimeFormatter dtfIn = DateTimeFormatter.ofPattern(
"uuuu-MM-dd HH:mm:ss.SSSxxxx",
Locale.ENGLISH
);
// parse it to an OffsetDateTime
OffsetDateTime odt = OffsetDateTime.parse(utcDatetimeString, dtfIn);
// then convert it to a ZonedDateTime applying UTC zone
ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("UTC"));
// prepare a formatter that produces the desired output
DateTimeFormatter dtfOut = DateTimeFormatter.ofPattern(
"EEE, MMM dd, uuuu HH:mm:ss zzz",
Locale.ENGLISH
);
// and print the ZonedDateTime using the formatter
System.out.println(zdt.format(dtfOut));
}
输出:
Sun, Feb 28, 2021 13:38:00 UTC