SimpleDateFormat 解析

SimpleDateFormat parse

我对 SimpleDateFormat 有疑问:

错误:

Unparseable date: "Thu, 09 Nov 2017 16:17:42 GMT"

代码:

DF_SERVER_FORMAT="EEE, dd MMM yyyy HH:mm:ss'Z'"
....
var formater=SimpleDateFormat(DF_SERVER_FORMAT)
formater.parse(source)

根据 SimpleDateFormat documentationZ(大写)用于 RFC 822 时区,例如-0800

对于一般时区,使用z

这应该有效:

DF_SERVER_FORMAT="EEE, dd MMM yyyy HH:mm:ss z"

试试 "EEE, d MMM yyyy HH:mm:ss z" 这个模式对我有用。

您可以尝试使用您的模式格式化一些日期,以查看差异,然后相应地修正您的模式。这是我在 J2SE 中所做的:

SimpleDateFormat df = new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss'Z'");
System.out.println(df.format(new Date()));

这是生产:

2017 年 11 月 9 日星期四 17:49:07Z

但是,当我使用模式“EEE, dd MMM yyyy HH:mm:ss z”时,它产生了预期的结果:

2017 年 11 月 9 日星期四 17:51:09 CET

对于任何可以(暂时)外部依赖或使用 Java 8 或更高版本的人,我想提供现代答案。因为我认为 SimpleDateFormat 早就过时了。

现代 Java 日期和时间 API 通常更易于使用。此外,您的字符串采用 RFC 1123 格式,而现代 API 带有此格式的格式化程序。所以不需要自己构建你的格式模式字符串(我的代码是纯粹的 Java,我相信你会采用 Kotlin):

    String dateString = "Thu, 09 Nov 2017 16:17:42 GMT";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateString, 
            DateTimeFormatter.RFC_1123_DATE_TIME);

这会按预期产生 2017-11-09T16:17:42ZOffsetDateTime

要在 Android 上使用它,请获取 ThreeTenABP, see . Java 8 and later come with the modern API built-in. If using Java 6 or 7 on non-Android, you need the ThreeTen Backport

你的代码出了什么问题?你在格式模式字符串中要求在几秒后立即输入文字 Z,没有 space之间。由于您的输入字符串在那里没有 Z,因此解析失败(取而代之的是 space 和偏移 ID GMT)。此外,您的代码似乎对语言环境很敏感:如果您的默认语言环境是 Thursday 的缩写不是 Thu 或者 November 不是 Nov,解析将失败(相反,RFC_1123_DATE_TIME 期望(并要求)day和独立于语言环境的英文月份缩写)。