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