错误org.threeten.bp.format.datetimeparseexception

jckbn6z7  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(413)

我知道有很多类似的问题像这样,但不能应用这些解决方案。我正在尝试将从服务器获取的日期转换为以下格式: 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"));

但是继续 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()我认为问题出在我的格式化程序中,但不知道如何解决这个问题

okxuctiv

okxuctiv1#

tl;博士

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

错误的格式化模式

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

错误类型

您的输入字符串缺少时区或utc偏移的指示器。您应该将此类输入解析为 LocalDateTime .

iso 8601

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

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

一刻也不

理解这样一个值本质上是不明确的。我们不知道这段文字是代表日本东京的凌晨2点,法国图卢兹的凌晨2点,还是美国俄亥俄州托莱多的凌晨2点——所有不同的时刻,相隔几个小时。那么 LocalDateTime 不代表一个时刻,也不是时间线上的一个点。
从不使用 LocalDateTime 跟踪特定事件发生的时间。要跟踪某个时刻,请使用 Instant , OffsetDateTimeZonedDateTime .

决定一个时刻

如果您确实知道文本表示某个时区的某个时刻,请应用 ZoneId 得到 ZonedDateTime . 然后提取一个 Instant 调整到utc,并获取自1970-01-01t00:00z的历元参考以来的毫秒数。
如果输入字符串表示utc中的某个时刻,请应用 ZoneOffset.UTC 得到 OffsetDateTime . 然后提取一个 Instant ,并计算出你的历元毫秒数。

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。
joda time项目现在处于维护模式,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要字符串,也不需要 java.sql.* 上课。Hibernate5和JPA2.2支持java.time。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11和更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9带来了一些小功能和修复。
JavaSE6和JavaSE7
大部分java.time功能都是通过三个后端口向后移植到Java6和Java7。
安卓
android(26+)的更高版本捆绑了java.time类的实现。
对于早期的android(<26),api去糖过程带来了最初未内置到android中的java.time功能的子集。
如果desugaring不能提供您需要的功能,threetenabp项目会将threeten backport(如上所述)应用于android。了解如何使用threetenabp…。

相关问题