ThreeTenABP DateTime 解析器给出 yyyy-MM-ddTHH:mm:ss 甲酸盐的异常
ThreeTenABP DateTime parser giving exception for yyyy-MM-ddTHH:mm:ss formate
我需要将 dateTime String
转换为 millis,为此我正在使用 ThreeTenABP,但是 OffSetDateTime.parse
无法解析用于 ex 的 dateTime String
。 "2020-08-14T20:05:00"
并给出以下异常。
Caused by: org.threeten.bp.format.DateTimeParseException:
Text '2020-09-22T20:35:00' could not be parsed:
Unable to obtain OffsetDateTime from TemporalAccessor:
DateTimeBuilder[, ISO, null, 2020-09-22, 20:35], type org.threeten.bp.format.DateTimeBuilder
我已经搜索过类似的问题,但找不到确切的解决方案。
下面是我在 Kotlin 中使用的代码。
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss",
Locale.ROOT)
val givenDateString = event?.eventDateTime
val timeInMillis = OffsetDateTime.parse(givenDateString, formatter)
.toInstant()
.toEpochMilli()
问题是您尝试解析为 OffsetDateTime
的 String
中缺少偏移量。 OffsetDateTime
不能在没有 ZoneOffset
的情况下创建,但是不能从这个 String
派生出 ZoneOffset
(可以 猜测 它是 UTC , 但这种情况不适合猜测)。
您可以将 String
解析为 LocalDateTime
(不带时区或偏移量的日期和时间表示),然后添加/附加所需的偏移量。您甚至不需要自定义 DateTimeFormatter
,因为您的 String
是 ISO 格式,可以使用默认的 built-in 格式化程序进行解析:
fun main() {
// example String
val givenDateString = "2020-09-22T20:35:00"
// determine the zone id of the device (you can alternatively set a fix one here)
val localZoneId: ZoneId = ZoneId.systemDefault()
// parse the String to a LocalDateTime
val localDateTime = LocalDateTime.parse(givenDateString)
// then create a ZonedDateTime by adding the zone id and convert it to an OffsetDateTime
val odt: OffsetDateTime = localDateTime.atZone(zoneId).toOffsetDateTime()
// get the time in epoch milliseconds
val timeInMillis = odt.toInstant().toEpochMilli()
// and print it
println("$odt ==> $timeInMillis")
}
此示例代码产生以下输出(注意日期时间表示中的尾随 Z
,这是 +00:00
小时的偏移量,UTC 时区,我在Kotlin Playground 并且它似乎有 UTC 时区 ;-) ):
2020-09-22T20:35Z ==> 1600806900000
请注意,我使用 java.time
而不是 ThreeTen ABP 进行了尝试,ThreeTen ABP 现在已经过时,无法用于许多(较低的)Android 版本,因为有 Android API Desugaring。但是,这应该没有什么区别,因为当我第一次尝试时,您的示例代码抛出了完全相同的异常,这意味着 ThreeTen 不应为此负责。
我需要将 dateTime String
转换为 millis,为此我正在使用 ThreeTenABP,但是 OffSetDateTime.parse
无法解析用于 ex 的 dateTime String
。 "2020-08-14T20:05:00"
并给出以下异常。
Caused by: org.threeten.bp.format.DateTimeParseException:
Text '2020-09-22T20:35:00' could not be parsed:
Unable to obtain OffsetDateTime from TemporalAccessor:
DateTimeBuilder[, ISO, null, 2020-09-22, 20:35], type org.threeten.bp.format.DateTimeBuilder
我已经搜索过类似的问题,但找不到确切的解决方案。
下面是我在 Kotlin 中使用的代码。
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss",
Locale.ROOT)
val givenDateString = event?.eventDateTime
val timeInMillis = OffsetDateTime.parse(givenDateString, formatter)
.toInstant()
.toEpochMilli()
问题是您尝试解析为 OffsetDateTime
的 String
中缺少偏移量。 OffsetDateTime
不能在没有 ZoneOffset
的情况下创建,但是不能从这个 String
派生出 ZoneOffset
(可以 猜测 它是 UTC , 但这种情况不适合猜测)。
您可以将 String
解析为 LocalDateTime
(不带时区或偏移量的日期和时间表示),然后添加/附加所需的偏移量。您甚至不需要自定义 DateTimeFormatter
,因为您的 String
是 ISO 格式,可以使用默认的 built-in 格式化程序进行解析:
fun main() {
// example String
val givenDateString = "2020-09-22T20:35:00"
// determine the zone id of the device (you can alternatively set a fix one here)
val localZoneId: ZoneId = ZoneId.systemDefault()
// parse the String to a LocalDateTime
val localDateTime = LocalDateTime.parse(givenDateString)
// then create a ZonedDateTime by adding the zone id and convert it to an OffsetDateTime
val odt: OffsetDateTime = localDateTime.atZone(zoneId).toOffsetDateTime()
// get the time in epoch milliseconds
val timeInMillis = odt.toInstant().toEpochMilli()
// and print it
println("$odt ==> $timeInMillis")
}
此示例代码产生以下输出(注意日期时间表示中的尾随 Z
,这是 +00:00
小时的偏移量,UTC 时区,我在Kotlin Playground 并且它似乎有 UTC 时区 ;-) ):
2020-09-22T20:35Z ==> 1600806900000
请注意,我使用 java.time
而不是 ThreeTen ABP 进行了尝试,ThreeTen ABP 现在已经过时,无法用于许多(较低的)Android 版本,因为有 Android API Desugaring。但是,这应该没有什么区别,因为当我第一次尝试时,您的示例代码抛出了完全相同的异常,这意味着 ThreeTen 不应为此负责。