我知道有很多类似的问题像这样,但不能应用这些解决方案。我正在尝试将从服务器获取的日期转换为以下格式: 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()我认为问题出在我的格式化程序中,但不知道如何解决这个问题
1条答案
按热度按时间okxuctiv1#
tl;博士
错误的格式化模式
您的输入字符串有一个小数秒。但您的格式模式表示只需要整秒钟。因此,您的格式设置模式与输入不匹配。这就是你的错误。
错误类型
您的输入字符串缺少时区或utc偏移的指示器。您应该将此类输入解析为
LocalDateTime
.iso 8601
您的输入符合iso 8601文本格式标准。在java.time解析/生成文本时默认使用标准格式。因此,无需指定格式化模式。
一刻也不
理解这样一个值本质上是不明确的。我们不知道这段文字是代表日本东京的凌晨2点,法国图卢兹的凌晨2点,还是美国俄亥俄州托莱多的凌晨2点——所有不同的时刻,相隔几个小时。那么
LocalDateTime
不代表一个时刻,也不是时间线上的一个点。从不使用
LocalDateTime
跟踪特定事件发生的时间。要跟踪某个时刻,请使用Instant
,OffsetDateTime
或ZonedDateTime
.决定一个时刻
如果您确实知道文本表示某个时区的某个时刻,请应用
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…。