Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 需要使用joda进行灵活的日期时间转换_Java_Datetime_Jodatime - Fatal编程技术网

Java 需要使用joda进行灵活的日期时间转换

Java 需要使用joda进行灵活的日期时间转换,java,datetime,jodatime,Java,Datetime,Jodatime,我想使用joda解析电子邮件中的日期时间字符串。不幸的是,我得到了各种不同的格式,例如 Wed, 19 Jan 2011 12:52:31 -0600 Wed, 19 Jan 2011 10:15:34 -0800 (PST) Wed, 19 Jan 2011 20:03:48 +0000 (UTC) Wed, 19 Jan 2011 17:02:08 -0600 (CST) Fri, 21 Jan 2011 10:39:55 +0100 (CET) Fri, 21 Jan 2011 17:50

我想使用joda解析电子邮件中的日期时间字符串。不幸的是,我得到了各种不同的格式,例如

Wed, 19 Jan 2011 12:52:31 -0600
Wed, 19 Jan 2011 10:15:34 -0800 (PST)
Wed, 19 Jan 2011 20:03:48 +0000 (UTC)
Wed, 19 Jan 2011 17:02:08 -0600 (CST)
Fri, 21 Jan 2011 10:39:55 +0100 (CET)
Fri, 21 Jan 2011 17:50:42 -0500 (EST)
Wed, 06 Apr 2011 15:38:25 GMT
Thu, 7 Apr 2011 11:38:24 +0200 
Fri,  8 Apr 2011 05:13:36 -0700 (MST)
20 Apr 2011 03:00:46 -0400
下面的代码捕获大多数变体,但不是所有变体(例如,当有两个空格而不是一个空格时,逗号丢失时,等等)。看起来很尴尬

有没有更优雅的方法来处理这个问题?请告知

            DateTimeParser[] parsers = {
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CET)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CST)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CEST)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(GMT)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(MST)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(PST)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(UTC)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EST)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EDT)'").getParser(),
                    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CDT)'").getParser(),
            };
            DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter();

            try {
                calendar = inputFormatter.withLocale(Locale.US).parseDateTime(date[0]);
            }
            catch(Exception e) {
                System.out.println("problem with " + date[0]);
            }

除了自己使用Joda的
DateTimeParser
和自己解析文本以建立有效的DateTime(我认为这需要大量工作)之外,我认为您的方法没有太多错误。但我确实认为你的格式太多了。我认为您的格式可以简化为:

 DateTimeParser[] parsers = {
     DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(),
     DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '('z')'").getParser(),
     DateTimeFormat.forPattern("E, d MMM y HH:mm:ss z").getParser(),
     DateTimeFormat.forPattern("dd MMM y HH:mm:ss Z").getParser(),
 };

Z(大写-Z)是RFC 822数字时区,small-Z是时区的首字母缩写,例如PDT。这仍然(平均)是每个解析请求引发2个异常,但如果不需要高性能,那可能还不错。

唯一“更优雅”的处理方法是编写自己的DateTimeParser实现。使用DateTimeFormatterBuilder,您可以将工作的部分(日/月/区域解析)与不工作的部分(解析一个或多个空格,解析括号中的可选时区缩写)粘合在一起,为需要特殊格式的位编写新的解析器。

小写的z在Joda time中不会解析,因为三个字母的缩写不明确