错误 org.threeten.bp.format.DateTimeParseException

Error org.threeten.bp.format.DateTimeParseException

提问人:gojic 提问时间:7/8/2021 更新时间:7/8/2021 访问量:748

问:

我知道有很多类似的问题,但不能将这些解决方案应用于它们。 我正在尝试转换我从服务器获得的日期,这种格式: 然后我尝试将其转换为毫秒,如下所示:2019-07-26T02:39:32.4053394

private long convertTimeInMilliseconds(String date){
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
    return OffsetDateTime.parse(date, formatter)
            .toInstant()
            .toEpochMilli();

}

在我的onCreate中,我调用了这个方法:

datePickerDialog.getDatePicker().setMinDate(convertTimeInMilliseconds("2019-07-26T02:39:32.4053394"));

但继续 .toInstant() 我认为这个问题出在我的格式化程序中,但不知道如何解决这个问题Caused by: org.threeten.bp.format.DateTimeParseException: Text '2019-07-26T02:39:32.4053394' could not be parsed, unparsed text found at index 19

java android 日期格式 threetenbp

评论

1赞 Basil Bourque 7/8/2021
顺便说一句,您可能不需要将 ThreeTen-Backport 用于较旧的 Android。最新的 Android 工具通过“API 脱糖”将大部分 java.time 功能引入旧版 Android。

答:

4赞 Basil Bourque 7/8/2021 #1

tl;博士

LocalDateTime
.parse( "2019-07-26T02:39:32.4053394" )
.atZone( 
    ZoneId.of( "Asia/Tokyo" ) 
)
.toInstant()
.getEpochMilli() 

错误的格式模式

输入字符串有小数秒。但是您的格式化模式显示只有整整几秒钟。因此,您的格式模式与您的输入不匹配。因此你的错误。

类型错误

输入字符串缺少时区指示符或 offset-from-UTC。您应该将此类输入解析为 .LocalDateTime

Table of date-time types in Java, both modern and legacy

国际标准化组织 8601

您的输入符合 ISO 8601 文本格式标准。在解析/生成文本时,java.time 默认使用标准格式。因此,无需指定格式模式。

LocalDateTime ldt = LocalDateTime.parse( "2019-07-26T02:39:32.4053394" ) ;

一刻也不行

要明白,这样的值本质上是模棱两可的。我们无法知道这段文字是代表日本东京的凌晨 2 点、法国图卢兹的凌晨 2 点,还是美国俄亥俄州托莱多的凌晨 2 点——所有不同的时刻,相隔几个小时。所以 a 代表一个时刻,不是时间轴上的一个点。LocalDateTime

永远不要用于跟踪特定事情发生的时间。要跟踪某个时刻,请使用 、 或 。LocalDateTimeInstantOffsetDateTimeZonedDateTime

确定一个时刻

如果您确定文本旨在表示某个时区的某个时刻,请应用 a 来获取 .然后提取 以调整到 UTC,并获取自 1970-01-01T00:00Z 纪元参考以来的毫秒数。ZoneIdZonedDateTimeInstant

如果您的输入字符串旨在表示 UTC 中显示的时刻,请申请获取 .然后提取一个 ,并得到你的纪元毫数。ZoneOffset.UTCOffsetDateTimeInstant


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 中搜索许多示例和解释。规范是 JSR 310

Joda-Time项目现在处于维护模式,建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 和 JPA 2.2 支持 java.timejava.sql.*

从哪里获取 java.time 类?

Table of which java.time library to use with which version of Java or Android