2011-05-13 3 views
11

joda를 사용하여 전자 메일에서 datetime 문자열을 구문 분석하고 싶습니다. 불행하게도 내가 예를 들어, 서로 다른 형식의 모든 종류를 얻을 수은 joda로 유연한 datetime 변환이 필요합니다.

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 

코드는 아래 잡는다 변형 대부분의 전부는 아니지만 (예를 들어, 하나가 아닌 두 개의 공백이있을 때 쉼표 등이 없을 때) . 그리고 그것은 어색해 보인다.

더 좋은 방법이 있나요? 제발 조언. 자신을 Joda의 DateTimeParser을 사용하고 기본적으로 자신이 (내가 많은 일이 될 것이라고 생각) 유효한 날짜 시간을 구축 텍스트, 난 당신의 접근 방식에 정말 많은 잘못이 있다고 생각하지 않습니다 구문 분석

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

답변

8

외부. 나는 당신이 너무 많은 형식을 가지고 있다고 생각하지.

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 숫자 시간대 작은-Z 예를 들어, PDT 같은 시간대의 약자입니다 : 나는 형식의 당신의 세트가 감소 될 수있다 생각합니다. 이것은 (평균적으로) 파스 요청 당 2 개의 예외가 발생하지만 여전히 고성능 일 필요가 없다면 그렇게 나쁘지는 않을 것입니다.

+0

세 문자 약어가 모호하기 때문에 소문자 z는 Joda-Time에서 구문 분석되지 않습니다. – JodaStephen

5

"우아한"유일한 방법은 DateTimeParser의 자체 구현을 작성하는 것입니다. DateTimeFormatterBuilder를 사용하면 작동하지 않는 부분 (하나 이상의 공백 파싱, 선택적 시간대 약어를 괄호로 파싱)을 사용하여 작업하는 부분 (일/월/영역 파싱)을 함께 붙일 수 있고, 해당 비트에 대한 새 파서 만 작성할 수 있습니다 특별한 서식이 필요해.

관련 문제