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

22

我尝试将日期/时间字符串转换为LocalDateTime对象并进行相反操作。我正在使用ThreeTenBp作为日期/时间库。

字符串-> 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

将LocalDateTime转换为字符串

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

由于某种原因,时区信息丢失:

期望值:<...6-12-27T08:15:05.674[+01:00]"> 实际值:<...6-12-27T08:15:05.674[]">
期望值为:"2016-12-27T08:15:05.674+01:00"
实际值为:"2016-12-27T08:15:05.674"

1个回答

24

LocalDateTime是不考虑时区偏移的类。您需要使用OffsetDateTime类。

将字符串转换为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 -> String

偏移日期时间 -> 字符串

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")

我们可以使用注解进行反序列化吗?即:@SomeDeserializeAnnotationLocalDateTime incomingIso8601DateTime; ? - atul ranjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接