OffsetDateTime to Date Android

时间:2017-08-14 13:07:39

标签: android date parsing

我从我们的后端以[{1}}格式获得OffsetDateTime,如下所示:

String

我正在尝试将此"2017-07-15T10:52:59Z" 解析为Android String

Date

总是抛出:

  

无法解释的日期:" 2017-07-15T10:52:59Z"

1 个答案:

答案 0 :(得分:2)

要解析ZUTC 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,因为此格式化程序不处理任何区域设置敏感信息(如月份和星期名称),因此在这种情况下它不会影响解析(并{{1如果你没有指定一个,那么已经使用了默认语言环境。

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

X

显然,此代码假设输入始终为UTC(最后为SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); mSimpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); )。

Java新日期/时间API

旧类(ZDateCalendar)有lots of problemsdesign issues,它们将被新API取代。< / p>

对于Android,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。为了使其有效,您还需要ThreeTenABP(更多关于如何使用它here)。

由于输入字符串位于ISO 8601 format,您可以轻松地将其解析为SimpleDateFormat

org.threeten.bp.OffsetDateTime

然后,您可以使用String dateString = "2017-07-15T10:52:59Z"; OffsetDateTime odt = OffsetDateTime.parse(dateString); 类轻松地将其转换为java.util.Date

org.threeten.bp.DateTimeUtils

如果输入始终为UTC(最后始终使用Date date = DateTimeUtils.toDate(odt.toInstant()); ),您还可以使用Z

org.threeten.bp.Instant

唯一的区别是String dateString = "2017-07-15T10:52:59Z"; Instant instant = Instant.parse(dateString); Date date = DateTimeUtils.toDate(instant); 仅解析UTC输入(以Instant结尾),Z接受任何有效的UTC偏移(例如OffsetDateTime-03:00 )。