如何在 Scala 中将日期格式转换为 UTC?



如何在 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,因为后者不会在最后打印StringUTC,即使ZoneOffset扩展ZoneId,如@deHaar所述。

如果你可以使用java.time,你需要

  • 一个DateTimeFormatter,用于使用输入示例的格式解析Strings,该格式非常接近 ISO 标准,但缺少日期和时间之间的'T'
  • 另一种DateTimeFormatter,用于以所需格式输出时态内容,其中包括星期几和一年中月份的(英语)缩写
  • 用于解析具有第一个DateTimeFormatterStringOffsetDateTime
  • 以 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

相关内容

  • 没有找到相关文章

最新更新