Java 8:根据 ISO 8601 使用区域偏移格式化 Instant

Ran*_*aul 2 java datetime datetime-format java-8 java-time

Instant我正在尝试根据本文中的参考从对象创建 ISO 8601 格式的 DateTime,我使用该格式YYYY-MM-DD'T'hh:mm:ss'T'ZD来解析即时日期,如下所示。

但它生成的时间格式错误:

2022-06-172T06:08:13T-0500172
Run Code Online (Sandbox Code Playgroud)

预期的格式应该是:

2022-06-21T13:31:49-05:00
Run Code Online (Sandbox Code Playgroud)

我的代码:

DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("YYYY-MM-DD'T'hh:mm:ss'T'ZD")
            .withZone(ZoneId.systemDefault());

formatter.format(Instant.now())
Run Code Online (Sandbox Code Playgroud)

如何生成如下所示的格式化时间?

2022-06-21T13:31:49-05:00
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 7

太长了;博士

帮助生成格式为 2022-06-21T13:31:49-05:00 的时间

OffsetDateTime.now().toString()
Run Code Online (Sandbox Code Playgroud)

2022-06-22T04:38:55.902569200+03:00

ISO 8601

无需定义格式化模式。

您所需的输出符合日期时间格式的ISO 8601标准。java.time类在解析/生成文本时默认使用这些标准格式

OffsetDateTime

要表示特定偏移中看到的时刻,请使用OffsetDateTime

OffsetDateTime odt = OffsetDateTime.now() ;
Run Code Online (Sandbox Code Playgroud)

通过调用 生成文本toString

String output = odt.toString() ;
Run Code Online (Sandbox Code Playgroud)

2022-06-22T04:38:55.902569200+03:00

如果您想丢弃秒的小数部分,请截断

OffsetDateTime
.now()
.truncatedTo( ChronoUnit.SECONDS )
.toString()
Run Code Online (Sandbox Code Playgroud)

2022-06-22T04:38:55+03:00