Kotlin - 无法解析的日期:“2021-07-20T12:35:07-07:00”

Kotlin - Unparseable date: "2021-07-20T12:35:07-07:00"

我遇到无法解析的日期异常:

"2021-07-20T12:35:20-07:00".toDate()!!

@SuppressLint("SimpleDateFormat")
fun String.toDate() : Date? {
    return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(this)
}

来自SimpleDateFormat docs

Z     Time zone   RFC 822 time zone   -0800
X     Time zone   ISO 8601 time zone  -08; -0800; -08:00

Z 指令要求指定时区时不带冒号,而 X 允许使用冒号。要么像

这样格式化你的日期
2021-07-20T12:35:20-0700

或使用 ISO 8601 时区指示符,而不是 RFC 822 时区指示符

yyyy-MM-dd'T'HH:mm:ssX

Try it online!

java.time 通过脱糖

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。请原谅我的 Java 语法:

public static OffsetDateTime toDate(String s) {
    return OffsetDateTime.parse(s);
}

我们来试试吧:

    OffsetDateTime dateTime = toDate("2021-07-20T12:35:20-07:00");
    System.out.println(dateTime);

输出为:

2021-07-20T12:35:20-07:00

我们根本不需要指定任何格式化程序。您的字符串采用 ISO 8601 格式。 OffsetDateTime 和 java.time 的另一个 类 将 ISO 8601 的最常见变体解析为默认值,即没有任何显式格式化程序。这很好,因为正如您所经历的,构造格式化程序很容易出错。

如果您需要 Date 对象用于尚未升级到 Java 的旧 API 时间,则转换为:

    Date oldfashionedDate = Date.from(dateTime.toInstant());
    System.out.println(oldfashionedDate);

输出(来自 Europe/Brussels 时区的设备):

Tue Jul 20 21:35:20 CEST 2021

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备(从 API 级别 26)中内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接