如果时区设置为“UTC”,SimpleDateFormat 会忽略“XXX”

问题描述 投票:0回答:2

我正在尝试按以下格式将当前日期时间输出为 UTC: 2016-01-11T14:08:42+00:00

final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

final String dateString = formatter.format(new Date());

“dateString”现在应包含“2016-01-11T14:08:42+00:00”,但它包含“2016-01-11T14:08:42Z”。

如果没有“UTC”时区设置,我会得到正确的格式,但是 - 当然 - 在我的特定时区......

有什么想法吗?

java date datetime timezone utc
2个回答
18
投票

请参阅 SimpleDateFormat 的文档:

对于格式化[使用 ISO 8601 时区],如果距 GMT 的偏移值为 0,则会生成“Z”。

因此,这种行为是预期的。

您可以:

  • 使用 RFC 822 时区格式化程序
    ZZZ
    ;然而,这会产生“+0000”
  • 操作字符串来替换最后的
    Z
    str.replaceAll("Z$", "+00:00")

0
投票

2016-01-11T14:08:42+00:00
2016-01-11T14:08:42Z
相同。

它们只是表示同一事物的不同方式。 ISO 8601 标准指定

Z
表示
+00:00
的时区偏移(或与 UTC 的零偏移)。

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。

使用现代日期时间 API 的解决方案

java.time
API 的类型使用 ISO 8601 标准格式。由于您的日期时间字符串采用 ISO 8601 标准格式,因此您可以使用
OffsetDateTime#parse
而无需显式指定
DateTimeFormatter

DateTimeFormatter
文档提到

区域偏移“Z”为零

因此,据我所知,没有办法使用

+00:00
来代替
Z
来获得
DateTimeFormatter
。正如 Andy Turner 提到的,您可以使用
String
操作将
Z
替换为
+00:00

演示:

import java.time.OffsetDateTime;

class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2016-01-11T14:08:42+00:00");
        System.out.println(odt);

        // String manipulation to replace Z with +00:00
        String formatted = odt.toString().replace("Z", "+00:00");
        System.out.println(formatted);
    }
}

在设置了 UTC 时区的 JVM 上执行时的输出:

2016-01-11T14:08:42Z
2016-01-11T14:08:42+00:00

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.