Android 上的 SimpleDateFormat 解析

SimpleDateFormat Parsing on Android

我正在尝试解析以下内容 date/time:

Wed, 29 Aug 2018 12:56:00 +0200

目前,我正在使用以下代码,它适用于我的 Android 模拟器,但在我的实际 phone 上,我得到一个 "java.text.ParseException: Unparseable date"

SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
this.pubDate = sdf.parse(s_pubDate);

您需要显式 设置格式化程序语言环境,否则它会尝试根据phone 语言环境来解析它,这可能会导致错误。我认为这是你的情况的原因。

您的模拟设备有一个语言环境,而您的 phone 有一个语言环境,但无法以这种格式解析日期。

SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z",
                    **YOUR DESIRED LOCALE**);

java.time

    String dateTimeString = "Wed, 29 Aug 2018 12:56:00 +0200";
    OffsetDateTime dateTime = OffsetDateTime.parse(
            dateTimeString, DateTimeFormatter.RFC_1123_DATE_TIME);
    System.out.println(dateTime);

此片段的输出是:

2018-08-29T12:56+02:00

您要解析的字符串格式为 RFC 1123。此格式内置于 Java 中,因此您无需为解析构建自己的格式化程序。此外,RFC 1123 始终是英文的,因此不存在您的 phone 的默认语言环境(或任何其他语言环境)干扰的风险。

我正在使用 java.time,现代 Java 日期和时间 API。您尝试使用的 SimpleDateFormat 不仅已经过时,而且出了名的麻烦。

问题:我可以在 Android 上使用 java.time 吗?

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

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接