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

Time ISO 8601日期时间格式组合';Z';和'的偏移量+;0000和x27;,time,datetime-format,iso8601,timezone-offset,Time,Datetime Format,Iso8601,Timezone Offset,我在玩ISO8601的日期时间格式。我有这样的模式: “yyyy-MM-dd'T'HH:MM:ssZZ'Z'” 输出为: “2015-11-17T00:00:00+0000Z” 我的问题是输出是否正常,是否可能在日期+0000和Z中考虑两者具有相同的含义时区偏移/id。提前感谢澄清=)否,不正常 否,Z是一个数值偏移量,因此不应将其与数值偏移量+00:00或+0000进行冗余组合 ISO 8601 虽然我无法获得该规范的付费副本,但该规范明确规定,Z必须遵循一天中的时间: …在时间之后直接添加一

我在玩ISO8601的日期时间格式。我有这样的模式:

“yyyy-MM-dd'T'HH:MM:ssZZ'Z'”

输出为:

“2015-11-17T00:00:00+0000Z”

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

否,不正常 否,
Z
是一个数值偏移量,因此不应将其与数值偏移量
+00:00
+0000
进行冗余组合

ISO 8601 虽然我无法获得该规范的付费副本,但该规范明确规定,
Z
必须遵循一天中的时间:

…在时间之后直接添加一个Z,不带空格

IETF RFC 3339 免费提供的ISO 8601配置文件将
Z
定义为附加到一天中的某个时间:

应用于时间的后缀

RFC还以正式形式声明,我们应该使用
Z
或数字。在ABNF中,斜杠(SOLIDUS)表示“或”(排除“或”),而方括号对表示“可选”

时间numofset=(“+”/“-”)时间小时[[“:”]时间分钟]

时区=“Z”/time numofset

此外,规范的第三部分特别建议不要包含冗余信息

JAVA java中内置的现代java.time类在解析/生成字符串时默认使用标准格式。看

解析文本输入 使用
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


看看这个。

@BasilBourque我认为不需要澄清,很明显,它会询问Java中的日期格式“2015-11-17T00:00:00+0000Z”=)是否正确:
final String date_format_ISO_8601=“yyy-MM-dd'T'HH:MM:ss.SSS'Z'
@someone某处不,不要将
Z
埋在一对单引号内。这将
Z
变成一个字符串文字,仅仅是一个装饰,而不是一个有意义的模式代码。我目前正在从事一个加密硬币项目,API规范要求在末尾使用“Z”,而不是“+0000”@有些人认为这很好,但这并不是定义一个坏格式模式的理由。格式化模式中的
Z
不应位于单引号内。我将编辑答案以显示使
Z
显示的简单方法:
Instant.now().toString()
。您可能需要截断任何微秒/纳秒:
Instant.now().truncatedTo(ChronoUnit.MILLIS).toString()