Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java threetenbp:解析带有时区名称的日期时出现解析异常_Java_Android_Parsing_Datetime_Threetenbp - Fatal编程技术网

Java threetenbp:解析带有时区名称的日期时出现解析异常

Java threetenbp:解析带有时区名称的日期时出现解析异常,java,android,parsing,datetime,threetenbp,Java,Android,Parsing,Datetime,Threetenbp,我正在尝试以EEE的格式解析日期,dd-MMM-yyy-HH:mm:ss-zzz,例如使用threeten的DateTimeFormatter的字符串“Tue,2017年5月16日07:44:48 GMT”。然而,由于某种原因,时区名称似乎无法被解析(我尝试在没有时区名称部分的情况下解析相同的字符串,这很有效) 以下是代码的解析部分: DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy

我正在尝试以EEE的格式解析日期,dd-MMM-yyy-HH:mm:ss-zzz,例如使用threeten的DateTimeFormatter的字符串“Tue,2017年5月16日07:44:48 GMT”。然而,由于某种原因,时区名称似乎无法被解析(我尝试在没有时区名称部分的情况下解析相同的字符串,这很有效)

以下是代码的解析部分:

DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);
我得到以下错误:

org.threeten.bp.format.DateTimeParseException:文本“2017年5月16日星期二” 无法在索引26处分析13:02:16 GMT'


我尝试了时区名称部分的各种不同格式(例如z,zzz,z,zzz),但都不起作用。同样,如果我解析一个没有时区名称部分的子字符串日期(转换为LocalDateTime),那么它可以工作,因此我确信问题出在时区名称上。有人知道问题出在哪里吗?

我不知道你的代码为什么不起作用。当我在Java8中使用
java.time
类时,它就会出现。所以这只是一个可能的解决方案的猜测:

    DateTimeFormatter parseFormatter = DateTimeFormatter.RFC_1123_DATE_TIME;
    ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);
你会注意到,这是一个轻微的简化在同一时间

记录为

返回RFC-1123日期时间格式化程序,例如“2008年6月3日星期二” 11:05:30格林尼治标准时间'

所以我认为它应该接受
GMT
作为时区名称。我应该说它适合你的约会字符串,而且它在我的电脑上也能工作。我相信这个格式化程序使用英文缩写来表示星期几和月份,而不考虑语言环境(或者您可以尝试
DateTimeFormatter.RFC\u 1123\u DATE\u TIME.withLocale(locale.English)
,但我真的认为这是不必要的)

也就是说,他们说你应该避免使用三个和四个字母的时区缩写。有些是模棱两可的,有些不是全时区,这会导致进一步的模棱两可。虽然格林尼治标准时间不是最危险的时间,但如果你能用偏移量(例如
+00:00
或仅仅
Z
)而不是三个字母的区域名称来获取日期字符串,那么你的问题将有一个坚如磐石的解决方案

请参见问题和答案中的两个示例。两者都成功了。

tl;博士 在macOS(非Android)上使用Three Ten Backport 1.3.4项目库时:

  • 我没有得到您的
    DateTimeParseException
    (解析成功)
  • 但是我确实得到了一个与java 8中内置的java.time类不同的时区。
    2017-05-16T13:02:16Z[非洲/蒙罗维亚]
    而不是
    2017-05-16T13:02:16Z[GMT]
非洲/蒙罗维亚
区域? 我们中的一些人已经看到了您的代码工作,显然是使用java 8中内置的java.time类

但是您的问题是关于Java6和Java7的这些类的后端口的。因此,我使用该项目库尝试了以下示例

package com.example.threetenbp.example;

import org.threeten.bp.*;
import org.threeten.bp.format.*;

import java.util.Locale;

/**
 * By Basil Bourque.
 */
public class App {
    public static void main ( String[] args ) {
        App app = new App ( );
        app.doIt ( );
    }

    private void doIt ( ) {
        String input = "Tue, 16 May 2017 13:02:16 GMT";
        DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern ( "EEE, dd MMM yyyy HH:mm:ss z" , Locale.ENGLISH );
        ZonedDateTime parsedDate = ZonedDateTime.parse ( input , parseFormatter );

        System.out.println ("parsedDate.toString(): " + parsedDate );
    }

}
在macOS Sierra 10.12.4上使用IntellJ 2017.1.x为Java 8构建和运行时,我得到了一个奇怪的结果。最后,我没有得到预期的
Z
Z[GMT]
,而是得到了利比里亚的时区。这是有效的,因为与UTC的偏移量实际上为零(与UTC/GMT相同)。但这并不是我们在Java 8类中看到的,正如我们在2017-05-16T13:02:16Z[GMT]中看到的那样

parsedDate.toString():2017-05-16T13:02:16Z[非洲/蒙罗维亚]


我没有Java 6或Java 7的实现供我使用。但我确实尝试在IntelliJ中设置构建字节码设置以使用Java6。同样的结果。

您的代码与my Java 8和
Java.time运行良好,并给出
2017-05-16T13:02:16Z[GMT]
。有趣。您是否尝试使用
DateTimeFormatter.RFC\u 1123\u DATE\u TIME
而不是模式字符串?这被记录为“如‘2008年6月3日星期二11:05:30 GMT’”。所以我认为它应该接受GMT作为时区名称。同样,尽管我推荐了中的解决方案,但RFC-1123日期时间格式化程序确实解决了这个问题。谢谢真奇怪,非常奇怪。但正如你所说,它是有效的,而且它不是完全错误的。