gpt4 book ai didi

android - OffsetDateTime to Date Android

转载 作者:行者123 更新时间:2023-11-29 19:10:02 27 4
gpt4 key购买 nike

我从后端以 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);
}

它总是抛出:

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

最佳答案

要解析 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 如果您不指定,则已使用默认语言环境)。

PS:X 模式是在 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)。

关于android - OffsetDateTime to Date Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45675241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com