我正在尝试构建 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.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