错误 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"));

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

tl;博士

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

格式模式错误

您输入的字符串中有小数秒。但是您的格式化模式表示只需要整整几秒钟。所以你的格式化模式与你的输入不匹配。因此你的错误。

类型错误

您输入的字符串缺少时区指示符或 offset-from-UTC。您应该将此类输入解析为 LocalDateTime.

ISO 8601

您输入的文本格式符合 ISO 8601 标准。 java.time 当 parsing/generating 文本时默认使用标准格式。因此无需指定格式模式。

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,并得到你的 epoch millis 计数。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time.

在哪里获取 java.time 类?