Java SimpleDataFormat解析

Java SimpleDataFormat解析,java,android,kotlin,simpledateformat,utc,Java,Android,Kotlin,Simpledateformat,Utc,我对SimpleDataFormat有一个问题: 错误: 不可解析日期:2017年11月9日星期四16:17:42 GMT 代码: 根据,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中所做的: Simpl

我对SimpleDataFormat有一个问题:

错误:

不可解析日期:2017年11月9日星期四16:17:42 GMT

代码:

根据,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-yyy-HH:mm:ss-z时,它产生了预期的结果:


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

对于那些暂时没有外部依赖的人,或者正在使用Java 8或更高版本的人,我想给出一个现代的答案。因为我认为SimeDead格式早已过时了。 现代Java日期和时间API通常更易于使用。此外,您的字符串是RFC1123格式的,现代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上使用此功能,请获取,请参阅。Java8及更高版本内置了现代API。如果在非Android上使用Java6或Java7,则需要


你的代码出了什么问题?对于格式模式字符串,您要求在秒后立即输入文字Z,中间没有空格。由于您的输入字符串没有Z,解析失败,相反,它有一个空格和偏移量ID GMT。此外,您的代码似乎对区域设置很敏感:如果您的默认区域设置是星期四的缩写不是Thu或十一月的缩写不是Nov,则解析将失败,RFC_1123_DATE_TIME需要并需要独立于语言环境的英语日和月缩写。

可能是缺少逗号?也许时区周围多余的撇号是个问题?值中有逗号,但模式中没有。谢谢,但没有帮助。你不应该使用引号,它将被视为一个字母,不会被解释。EEE,dd-MMM-yyyy-HH:mm:ss z和EEE,dd-MMM-yyyy-HH:mm:ss'z对我不起作用!您必须以不同的方式执行其他操作。向SimpleDateFormat提供讲英语的区域设置(如locale.ROOT或locale.English)可能会有所帮助,以确保它理解英语中的“Thu”和“Nov”。是的,请将区域设置为helpd
    String dateString = "Thu, 09 Nov 2017 16:17:42 GMT";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateString, 
            DateTimeFormatter.RFC_1123_DATE_TIME);