need flexible datetime conversion with joda

空扰寡人 提交于 2019-12-12 09:35:11

问题


I want to use joda to parse datetime strings in emails. Unfortunately I get all kinds of different formats, for example

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

The code below catches most of the variants but not all (for example, when there are two spaces instead of one, when the comma is missing etc.). And it looks just awkward.

Is there a more elegant way to handle this? Please advise.

            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]);
            }

回答1:


Outside of using Joda's DateTimeParser yourself and essentially parsing the text yourself building up a valid DateTime (which i think would be a lot of work), i don't think there's really much wrong with your approach. I do think that you have too many formats though. I think your set of formats could be reduced to:

 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 (Capital-Z) is the RFC 822 numeric timezone and small-z is the acronym for the timezone, like PDT, for example. This is still (on average) 2 exceptions thrown per parse request but if this doesn't need to be high-performance, that's probably not so bad.




回答2:


The only "more elegant" way to handle this is to write your own implementation of DateTimeParser. Using DateTimeFormatterBuilder you can glue together parts that do work (day/month/zone parsing) with parts that don't work (parsing one or more spaces, parsing an optional time zone abbreviation in brackets), writing a new parser just for those bits whichh need special formatting.



来源:https://stackoverflow.com/questions/5994086/need-flexible-datetime-conversion-with-joda

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!