ISO 8601日期时间格式组合'Z'和'+0000'的偏移

时间:2016-03-07 23:50:12

标签: time datetime-format iso8601 timezone-offset

我正在使用ISO 8601的日期时间格式。我有这种模式:

"yyyy-MM-dd'T'HH:mm:ssZZ'Z'"

,输出为:

"2015-11-17T00:00:00+0000Z"

我的问题是输出是否正常,是否可能在日期+0000和Z考虑两者具有相同的含义时区偏移/ id。在此先感谢澄清=)

1 个答案:

答案 0 :(得分:4)

不,不行

不,Z offset-from-UTC因此不应与+00:00+0000的数字偏移量进行冗余组合。< / p>

ISO 8601

虽然我无法访问ISO 8601规范的付费副本,但Wikipedia page明确指出Z必须遵循时间:

  

...在没有空格的情况下直接添加Z.

IETF RFC 3339

可自由使用的RFC 3339,ISO 8601的个人资料,定义Z附加到时间:

  

后缀......适用于某个时间......

RFC还通过正式ABNF notation声明我们应该使用 一个Z或一个数字。在ABNF中,斜杠(SOLIDUS)表示“或”(不包括“或”),而这对方括号表示“可选”。

  

time-numoffset =(&#34; +&#34; /&#34; - &#34;)time-hour [[&#34;:&#34;] time-minute]

     

时区=&#34; Z&#34; / time-numoffset

此外,规范的section 5.4特别建议反对,包括冗余信息。

的Java

在解析/生成字符串时,默认情况下,Java中内置的现代 java.time 类使用标准ISO 8601格式。请参阅Oracle Tutorial

解析文本输入

使用Z

Instant instant = Instant.parse( "2019-01-23T12:34:56.123456789Z" ) ;

使用+00:00

OffsetDateTime odt = OffsetDateTime.parse( "2019-01-23T12:34:56.123456789+00:00" ) ;

生成文本输出

要使用Z创建字符串,只需致电Instant::toString

String output = Instant.now().toString() ;  // Capture the current moment in UTC, then generate text representing that value in standard ISO 8601 using the `Z` offset-indicator.
  

2019-05-22T21:00:52.214709Z

要使用00:00创建字符串,请致电OffsetDateTime::format。使用带有您定义的格式模式的DateTimeFormatter生成文本。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSxxx" ) ;
String output = OffsetDateTime.now( ZoneOffset.UTC ).format( f ) ;
  

2019-05-22T21:00:52.319076 + 00:00

截断情形

您可能希望截断任何微秒或纳秒。

Instant
.now()
.truncatedTo( ChronoUnit.MILLIS )
.toString()
  

2019-05-22T21:11:28.970Z

...和...

OffsetDateTime
.now( ZoneOffset.UTC )
.truncatedTo( ChronoUnit.MILLIS )
.format( 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSxxx" )
)
  

2019-05-22T21:11:29.078 + 00:00

请参阅此code running live at IdeOne.com