2013-06-27 2 views
3

RSS 항목에서 joda를 사용하여 pubDate를 구문 분석합니다. 날짜는 RFC-822 형식에 있어야 : http://feed2.w3.org/docs/error/InvalidRFC2822Date.htmlRSS 항목의 jub - pubDate의 시간대를 구문 분석합니다.

문제가있을 때 날짜와 같은 것입니다 : 내가 가진 2002년 10월 2일 (수) 13:00:00 그리니치 표준시 패턴을 사용 :

수, 15시 0분 0초 0200 2002 10월 2일 :
DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed(); 

그러나이 될 수는 같은 날짜. 이 경우 ZZZ는 작동하지 않으므로 하나를 사용해야합니다.

DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").withLocale(Locale.ENGLISH).withOffsetParsed(); 

유니버설 솔루션을 만드는 방법은 무엇입니까?

+0

Java에서 RFC822 표준 시간대 구문 분석의 잠재적 복제 http://stackoverflow.com/a/2823558 –

답변

2

:

  1. 사용 DateTimeFormatterBuilder의 선택 파서 :

    // create parser for "GMT" 
    DateTimeParser gmtParser = DateTimeFormat.forPattern("ZZZ").getParser(); 
    
    // create parser for "+0200" 
    DateTimeParser offsetParser = DateTimeFormat.forPattern("Z").getParser(); 
    
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
        .appendPattern("EEE, dd MMM yyyy HH:mm:ss ") // common pattern 
        .appendOptional(gmtParser) // optional parser for GMT 
        .appendOptional(offsetParser) // optional parser for +0200 
        .toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed(); 
    
  2. System.out.println(formatter.parseDateTime("Wed, 02 Oct 2002 13:00:00 GMT")); 
    System.out.println(formatter.parseDateTime("Wed, 02 Oct 2002 15:00:00 +0200")); 
    

    : 상기 용액의 임의의 formatter 모두 입력으로 작동하여

    // create array with all possible patterns 
    DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").getParser(), 
        DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").getParser() 
    }; 
    
    // create a formatter using the parsers array 
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
        .append(null, parsers) // use parsers array 
        .toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed(); 
    

: 10,403,210 DateTimeFormatterBuilder 다른 입력을 분석하는데 사용될 수 파서의 배열을 수신 할 출력은 다음과 같습니다 :

2002-10-02T13:00:00.000Z 
2002-10-02T15:00:00.000+02:00 

참고 : 나는 모든 패턴 중에서 공통적 인 부분과 거의 유사하지 않은 경우 첫 번째 해결 방법이 더 좋습니다. 두 번째 해결 방법은 패턴이 서로 매우 다른 경우 더 좋습니다. 그러나 나는 또한 그것이 의견의 문제라고 믿으며 선택하는 것은 당신의 몫입니다.

1

해결 솔루션 : 나는 JodaTime 2.7와 테스트를 만들어 그것을 할 수있는 2 가지 방법을 발견했습니다

dateTimeFormat = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed(); 
    dateTimeFormatOneZ = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").withLocale(Locale.ENGLISH).withOffsetParsed(); 

private DateTime convertToDate(String pubDate) { 

    try { 
     return dateTimeFormat.parseDateTime(pubDate); 
    } catch (Exception e) { 
     try { 
      return dateTimeFormatOneZ.parseDateTime(pubDate); 
     } catch (Exception e1) { 
      return null; 
     } 
    } 
} 
관련 문제