Java 8 DateFormatBuilder API 用于构建 ISO 8601 日期格式

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

我正在尝试构建 ISO 8601 格式(“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”)。我使用 Java 8 DateFormatBuilder 解析 ISO 8601 格式的字符串。

当我遇到 UTC 时间时,格式化的输出是“2016-11-01T16:51:35.000Z”,但我真正需要的是 00:00 而不是 Z。我尝试使用 DateFormatBuilder 来构建它,但没有成功。

我终于做了以下事情

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DATETIMEFOMATTER = builder.parseCaseInsensitive()
                .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
                .toFormatter();

ZonedDateTime zonedDate = ZonedDateTime.parse(date, DATETIMEFOMATTER);
        String utcDate = zonedDate.format(FORMATTER);
        if (utcDate.indexOf("Z") != -1){
            utcDate = utcDate.replace("Z", "-00:00");
        }

我不想解析字符串并将 Z 替换为“00:00”。 Joda API 更容易使用。知道我们是否可以使用 Java 8 DateTimeFormatterBuilder 进行构建吗?我确实提到了一些 stackoverflow 问题,但没有成功。我可能做错了什么。有人可以帮忙吗?

java-8 date-formatting
1个回答
11
投票

内置

java.time 类内置了对 ISO 8601 标准日期时间值格式的支持。无需指定格式模式。

您的输入字符串可以直接由

Instant
类进行解析。

Instant instant = Instant.parse( "2016-11-01T16:51:35.000Z" );

要生成一个类似的字符串,其中包含所需数量的小数秒数字(三组(0、3、6 或 9 位数字)),只需调用

toString()

String output = instant.toString();

2016-11-01T16:51:35Z

Z
是商业、航空航天和军事领域通用的标准。
Z
Zulu
的缩写,表示 UTC。

虽然

Z
应该是完全可以接受的,但您似乎要求与 UTC 的偏移量为零小时和零分钟的数字,
+00:00
。虽然正数的零小时和分钟也是可以接受的,但负数
-00:00
可接受的
并且违反了ISO 8601。您的问题使用的负零偏移量需要替换为正零。

请注意,RFC 3339 据称是 ISO 8601 的一个配置文件,但却打破了此规则,允许负零偏移,并给出了“偏移未知”的特殊且令人困惑的含义。相反,指示未知偏移量的明智方法是简单地省略偏移量,仅保留日期和时间。这种古怪的反功能并不是 RFC 3339 中唯一糟糕的设计决策。因此我建议避免使用 RFC 并严格遵守 ISO 8601。

要轻松获得您想要的带有正零的字符串,并且无需显式使用

DateTimeFormatter
,请使用
OffsetDateTime
,同时分配已定义为常量
ZoneOffset.UTC
的 UTC 偏移量。然后只需拨打
toString
即可。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
String output = odt.toString();

2016-11-01T16:51:35+00:00

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