提问人:gojic 提问时间:7/8/2021 更新时间:7/8/2021 访问量:748
错误 org.threeten.bp.format.DateTimeParseException
Error org.threeten.bp.format.DateTimeParseException
问:
我知道有很多类似的问题,但不能将这些解决方案应用于它们。
我正在尝试转换我从服务器获得的日期,这种格式: 然后我尝试将其转换为毫秒,如下所示: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
答:
tl;博士
LocalDateTime
.parse( "2019-07-26T02:39:32.4053394" )
.atZone(
ZoneId.of( "Asia/Tokyo" )
)
.toInstant()
.getEpochMilli()
错误的格式模式
输入字符串有小数秒。但是您的格式化模式显示只有整整几秒钟。因此,您的格式模式与您的输入不匹配。因此你的错误。
类型错误
输入字符串缺少时区指示符或 offset-from-UTC。您应该将此类输入解析为 .LocalDateTime
国际标准化组织 8601
您的输入符合 ISO 8601 文本格式标准。在解析/生成文本时,java.time 默认使用标准格式。因此,无需指定格式模式。
LocalDateTime ldt = LocalDateTime.parse( "2019-07-26T02:39:32.4053394" ) ;
一刻也不行
要明白,这样的值本质上是模棱两可的。我们无法知道这段文字是代表日本东京的凌晨 2 点、法国图卢兹的凌晨 2 点,还是美国俄亥俄州托莱多的凌晨 2 点——所有不同的时刻,相隔几个小时。所以 a 不代表一个时刻,不是时间轴上的一个点。LocalDateTime
永远不要用于跟踪特定事情发生的时间。要跟踪某个时刻,请使用 、 或 。LocalDateTime
Instant
OffsetDateTime
ZonedDateTime
确定一个时刻
如果您确定文本旨在表示某个时区的某个时刻,请应用 a 来获取 .然后提取 以调整到 UTC,并获取自 1970-01-01T00:00Z 纪元参考以来的毫秒数。ZoneId
ZonedDateTime
Instant
如果您的输入字符串旨在表示 UTC 中显示的时刻,请申请获取 .然后提取一个 ,并得到你的纪元毫数。ZoneOffset.UTC
OffsetDateTime
Instant
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 中搜索许多示例和解释。规范是 JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 和 JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?
- Java SE 8、Java SE 9、Java SE 10、Java SE 11 及更高版本 - 标准 Java API 的一部分,具有捆绑实现。
- Java 9 带来了一些小功能和修复。
- Java SE 6 和 Java SE 7
- 大多数 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。
- 人造人
- 更高版本的 Android (26+) 捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),API 脱糖过程带来了最初未内置于 Android 中的 java.time 功能的子集。
- 如果脱糖不能提供您需要的东西,ThreeTenABP项目会将ThreeTen-Backport(如上所述)适应Android。请参阅如何使用 ThreeTenABP....
评论