我从我们的后端以[{1}}格式获得OffsetDateTime
,如下所示:
String
我正在尝试将此"2017-07-15T10:52:59Z"
解析为Android String
:
Date
总是抛出:
无法解释的日期:" 2017-07-15T10:52:59Z"
答案 0 :(得分:2)
要解析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
,因为此格式化程序不处理任何区域设置敏感信息(如月份和星期名称),因此在这种情况下它不会影响解析(并{{1如果你没有指定一个,那么已经使用了默认语言环境。
PS :JDK 7中引入了SimpleDateFormat
模式。如果您使用的是旧版本,则无法使用。在这种情况下,您可以将UTC设置为格式化程序的时区:
X
显然,此代码假设输入始终为UTC(最后为SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
mSimpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
)。
旧类(Z
,Date
和Calendar
)有lots of problems和design 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
)。