我知道有许多类似的问题,但不能应用这些解决方案。我正在尝试转换从服务器中获取的日期--这个格式是: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()我认为这个问题在格式化程序中,但是不知道如何解决这个问题
发布于 2021-07-07 16:19:54
tl;dr
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、OffsetDateTime或ZonedDateTime。
决定时刻
如果您确实知道文本表示某个时区中的某个时刻,那么应用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.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参见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类?

https://stackoverflow.com/questions/68289563
复制相似问题