如何将 LocalDateTime 对象转换为包含时区的 ISO 字符串?

How to convert LocalDateTime object into ISO string including time zone?

我正在尝试将 date/time 字符串来回转换为 LocalDateTime 对象。我正在使用 ThreeTenBp 作为 date/time 库。

字符串 -> LocalDateTime

val actual = LocalDateTime.parse("2016-12-27T08:15:05.674+01:00", 
                                 DateTimeFormatter.ISO_DATE_TIME)
val expected = LocalDateTime.of(2016, 12, 27, 8, 15, 5, 674000000)
assertThat(actual).isEqualTo(expected) // Successful

本地日期时间 -> 字符串

val dateTime = LocalDateTime.of(2016, 12, 27, 8, 15, 5, 674000000)
val actual  = dateTime.format(DateTimeFormatter.ISO_DATE_TIME)
assertThat(actual).isEqualTo("2016-12-27T08:15:05.674+01:00") // Fails

由于某种原因缺少时区:

expected: <...6-12-27T08:15:05.674[+01:00]"> but was:<...6-12-27T08:15:05.674[]">
Expected :"2016-12-27T08:15:05.674+01:00"
Actual :"2016-12-27T08:15:05.674"

LocalDateTime 是 offset/timezone 不可知论者 class。你需要一个 OffsetDateTime class.

字符串 -> OffsetDateTime

val actual = OffsetDateTime.parse("2016-12-27T08:15:05.674+01:00", DateTimeFormatter.ISO_DATE_TIME)
val expected = OffsetDateTime.of(2016, 12, 27, 8, 15, 5, 674000000, ZoneOffset.of("+01:00"))
assertThat(actual).isEqualTo(expected)

OffsetDateTime -> 字符串

val dateTime = OffsetDateTime.of(2016, 12, 27, 8, 15, 5, 674000000, ZoneOffset.of("+01:00"))
val actual  = dateTime.format(DateTimeFormatter.ISO_DATE_TIME)
assertThat(actual).isEqualTo("2016-12-27T08:15:05.674+01:00")