【问题标题】:OffsetDateTime to Date AndroidOffsetDateTime 到日期 Android
【发布时间】:2017-08-14 13:07:39
【问题描述】:

我从我们的后端收到String 格式的OffsetDateTime,如下所示:

"2017-07-15T10:52:59Z"

我正在尝试将此 String 解析为 Android Date

private SimpleDateFormat mSimpleDateFormat;
private static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
mSimpleDateFormat = new SimpleDateFormat(DATE_FORMAT_PATTERN, Locale.getDefault());

Date newDate = null;
String dateString = notice.getCreated();

try {
    newDate = mSimpleDateFormat.parse(dateString);
} catch (ParseException e) {
    LogHelper.showExceptionLog(MyClass.class, e);
}

它总是抛出:

无法解析的日期:“2017-07-15T10:52:59Z”

【问题讨论】:

    标签: android date parsing


    【解决方案1】:

    要解析Z(即UTC designator),您必须使用X 模式(如javadoc 中所述):

    SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
    
    String dateString = "2017-07-15T10:52:59Z";
    Date newDate = mSimpleDateFormat.parse(dateString);
    

    如果您仅使用 yyyy-MM-dd'T'HH:mm:ss 作为模式,SimpleDateFormat 将使用系统的默认时区并忽略 Z,从而给出不正确的结果:它会将日期/时间解析为默认时区中的 10:52 ,它可能与 UTC 中的 10:52 不同。通过使用X 模式,您可以获得正确的结果。

    我还删除了Locale,因为此格式化程序不处理任何区域设置敏感信息(如月份和星期几名称),因此在这种情况下它不会影响解析(并且SimpleDateFormat 已经使用如果您不指定,则使用默认语言环境)。

    PSX 模式是在 JDK 7 中引入的。如果您使用的是旧版本,它将不可用。在这种情况下,您可以将 UTC 设置为格式化程序的时区:

    SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    mSimpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    

    显然,这段代码假设输入始终为 UTC(最后是 Z)。


    Java 新日期/时间 API

    旧的类(DateCalendarSimpleDateFormat)有 lots of problemsdesign issues,它们正在被新的 API 取代。

    对于 Android,您可以使用 ThreeTen Backport,它是 Java 8 新日期/时间类的出色反向移植。为了使它工作,你还需要ThreeTenABP(更多关于如何使用它here)。

    由于输入字符串在ISO 8601 format,您可以轻松地将其解析为org.threeten.bp.OffsetDateTime

    String dateString = "2017-07-15T10:52:59Z";
    OffsetDateTime odt = OffsetDateTime.parse(dateString);
    

    然后,您可以使用 org.threeten.bp.DateTimeUtils 类轻松地将其转换为 java.util.Date

    Date date = DateTimeUtils.toDate(odt.toInstant());
    

    如果输入始终为 UTC(始终以 Z 结尾),您也可以使用 org.threeten.bp.Instant

    String dateString = "2017-07-15T10:52:59Z";
    Instant instant = Instant.parse(dateString);
    Date date = DateTimeUtils.toDate(instant);
    

    唯一的区别是Instant 只解析UTC 输入(以Z 结尾),而OffsetDateTime 接受任何有效的UTC 偏移量(如-03:00+05:30)。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      相关资源
      最近更新 更多