threetenbp:使用时区名称解析日期时解析异常

时间:2017-05-16 14:40:06

标签: java android parsing datetime threetenbp

我正在尝试以EEE,dd MMM yyyy 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:Text'Tue,2017年5月16日   格林威治标准时间13:02:16无法在指数26处解析

我为时区名称部分尝试了各种不同的格式(例如z,zzz,Z,ZZZ),但没有任何效果。同样,如果我解析一个没有时区名称部分的子日期(进入LocalDateTime),那么它可以工作,所以我确信问题是以某种方式与时区名称。有谁知道问题可能是什么?

2 个答案:

答案 0 :(得分:3)

我不知道为什么你的代码不起作用。我在Java 8中使用java.time类时会这样做。所以这只是对可能修复的猜测:

    DateTimeFormatter parseFormatter = DateTimeFormatter.RFC_1123_DATE_TIME;
    ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);

您会注意到它在同一时刻略有简化。

DateTimeFormatter.RFC_1123_DATE_TIME记录为

  

返回RFC-1123日期时格式化程序,例如'2008年6月3日星期二   11:05:30 GMT'。

所以我认为它应该接受GMT作为时区名称。我应该说它适合你的日期字符串,它也适用于我的电脑。我相信这个格式化程序使用英文缩写来表示星期几和月份,无论语言环境如何(或者您可以尝试DateTimeFormatter.RFC_1123_DATE_TIME.withLocale(Locale.ENGLISH),但我真的不认为这是必要的。)

那就是说,他们说你应该避免使用三个和四个字母的时区缩写。有些是模棱两可的,有些不是全时区,这导致更加模糊。虽然GMT不是最危险的,但如果你能得到带有偏移量的日期字符串,例如+00:00Z,而不是三个字母区域,那么解决问题的方法就是坚如磐石的解决方案。名。

请参阅问题和本答案running live at IdeOne.com中的两个示例。两者都成功了。

答案 1 :(得分:1)

TL;博士

在macOS(非Android)上使用 ThreeTen-Backport 1.3.4项目库时:

  • 获取DateTimeParseException(解析成功)
  • 但我得到的不同的时区比在Java 8中内置的java.time类中指定的 2017-05-16T13:02:16Z[Africa/Monrovia]而不是2017-05-16T13:02:16Z[GMT]

Africa/Monrovia区域?

我们中的一些人已经看到你的代码工作,显然使用了Java 8中内置的java.time类。

但是你的问题是关于Java 6&的那些类的后端。 Java 7.所以我使用ThreeTen-Backport项目库尝试了以下示例。

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。我没有在最后获得预期的ZZ[GMT],而是在利比里亚获得了时区Africa/Monrovia。这是有效的,因为从UTC的偏移确实为零(与UTC / GMT相同)。但这不是我们看到的{8}看到的{8}类,我们得到2017-05-16T13:02:16Z[GMT]

  

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

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