当前位置: 首页 > 知识库问答 >
问题:

给出yyyy-mm-ddthh:mm:ss formate异常的ThreeTenABP DateTime解析器

司允晨
2023-03-14

我需要将dateTime字符串转换为millis,为此我使用了ThreeTenABP,但是offsetDateTime.parse无法解析用于ex的dateTime字符串“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()

共有1个答案

公西苗宣
2023-03-14

问题是字符串中缺少偏移量,您试图将其解析为offsetdatetime。如果没有ZoneOffset,则无法创建OFFSetDateTime,但是不能从这个字符串派生ZoneOffset(可以猜测它是UTC,但是在这种情况下猜测是不合适的)。

您可以将字符串解析为LocalDateTime(一天中没有区域或偏移量的日期和时间的表示形式),然后添加/附加所需的偏移量。您甚至不需要自定义DateTimeFormatter,因为您的字符串是ISO格式的,可以使用默认的内置格式化程序解析:

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

这个示例代码产生以下输出(注意datetime表示形式中后面的z,这是+00:00小时的偏移量,UTC时区,我在Kotlin Playground写了这段代码,它似乎有UTC时区;-)):

2020-09-22T20:35Z ==> 1600806900000

请注意,我使用java.time而不是ThreeTen ABP进行了尝试,ThreeTen ABP对于许多(较低的)Android版本来说已经过时了,因为有Android API desugring。但是,这不会有什么不同,因为当我第一次尝试时,您的示例代码抛出了完全相同的异常,这意味着ThreeTen不应该为此负责。

 类似资料:
  • 问题内容: 如果能找到有关此异常的错误的帮助,我将不胜感激: 和以下代码: 它用引发异常。 ,作为例外。 谢谢。 问题答案: 代表时区字符。需要引用:

  • 问题内容: 我正在获取以下代码 如果我注释掉该行,那么我会在输出中看到时差 我究竟做错了什么?? 问题答案: “ S”为毫秒。每秒有1000毫秒(0到999)。389362大于999。多余的389000毫秒将转换为389秒或6分29秒,并添加到时间中。

  • 问题内容: 我希望将日期格式更改为MM / DD / YYYY,当前为YYYY / MM / DD。 我尝试进行研究,但具有讽刺意味的是,情况总是相反。现在有人可能会说将其向后尝试从那里开始尝试,但没有成功。 我上课的所有事情: 顺便说一下,我不熟悉的简单日期格式类和日期格式类,并且尝试实现它们均未成功。 问题答案: 只需使用即可转换为。无需麻烦的API。 而是在整个代码中使用此对象。每当您需要将

  • 问题内容: 我想在Java中解析这种格式为dd / MM / yyyy [至dd / MM / yyyy]的String的最佳方法是什么。带[]的字符串是可选的,dd代表日期的2位数字表示,MM是月份的2位数字表示,yyyy是年份的4位数字表示。 更新资料 谢谢大家的快速响应,但是我忘了告诉您[]是象征可选的,字符串中没有[]示例字符串可能是 22/01/2010 从22/01/2010至23/0

  • 我有一个包含OClass对象的列表。我想创建这个对象的JSON。下面是我的代码: com.fasterxml.jackson.databind.jsonMappingException:未发现用于com.ontotext.trree.owlim_ext.r类的序列化程序,也未发现用于创建BeanSerializer的属性(为了避免异常,禁用serializationconfig.serializa

  • 问题内容: 我正在尝试将yyyy-MM-dd’T’HH:mm:ss.SSSz格式的日期格式化为yyyy-mm-dd HH:mm:ss,这应该很简单,但我无法正常工作。 必须解析的日期的格式为:2012-10-01T09:45:00.000 + 02:00 现在,我使用此简单的日期格式化程序对其进行格式化: 但这给出的输出类似于2012-10-01T09:45:00.000UTC + 00:00。