首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >误差org.threeten.bp.format.DateTimeParseException

误差org.threeten.bp.format.DateTimeParseException
EN

Stack Overflow用户
提问于 2021-07-07 16:12:16
回答 1查看 437关注 0票数 0

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

代码语言:javascript
复制
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中,我称之为这个方法:

代码语言:javascript
复制
datePickerDialog.getDatePicker().setMinDate(convertTimeInMilliseconds("2019-07-26T02:39:32.4053394"));

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-07 16:19:54

tl;dr

代码语言:javascript
复制
LocalDateTime
.parse( "2019-07-26T02:39:32.4053394" )
.atZone( 
    ZoneId.of( "Asia/Tokyo" ) 
)
.toInstant()
.getEpochMilli() 

错误格式模式

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

错误类型

您的输入字符串缺少时区指示符或偏离-UTC。您应该将这种输入解析为LocalDateTime

ISO 8601

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

代码语言:javascript
复制
LocalDateTime ldt = LocalDateTime.parse( "2019-07-26T02:39:32.4053394" ) ;

一刹那

理解这样的价值本质上是含糊不清的。我们不知道该文本是否代表了日本东京的凌晨2点,法国图卢兹的2点,或美国俄亥俄州托莱多的2点--每隔几个小时就有不同的时刻。因此,LocalDateTime并不代表一个时刻,也不是时间线上的一个点。

不要使用LocalDateTime来跟踪什么时候发生了特定的事情。要跟踪片刻,请使用InstantOffsetDateTimeZonedDateTime

决定时刻

如果您确实知道文本表示某个时区中的某个时刻,那么应用ZoneId来获得一个ZonedDateTime。然后提取一个Instant以调整到UTC,并获得自1970-01-01T00:00Z的历次引用以来的毫秒数。

如果您的输入字符串表示在UTC中看到的某个时刻,那么应用ZoneOffset.UTC来获得一个OffsetDateTime。然后提取一个Instant,并得到你的时代米利斯计数。

关于java.time

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。Hibernate 5&JPA2.2支持java.time。

在哪里获得java.time类?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68289563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档