Program Tip

Joda 날짜 및 시간 API를 사용하여 여러 형식 구문 분석

programtip 2020. 10. 23. 08:20
반응형

Joda 날짜 및 시간 API를 사용하여 여러 형식 구문 분석


Joda를 사용하여 날짜 / 시간이 포함 된 타사 로그 파일을 구문 분석하고 있습니다. 날짜 / 시간은 내가 파싱하는 로그 파일의 나이에 따라 두 가지 형식 중 하나입니다.

현재 다음과 같은 코드가 있습니다.

try {
    return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
    return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}

이것은 작동하지만, Effective Java 2nd Edition의 Joshua Bloch의 조언에 위배됩니다 (항목 57 : 예외적 인 조건에만 예외 사용). 또한 로그 파일의 날짜 / 시간이 잘못되어 IllegalArgumentException이 발생하는지 확인하기 어렵습니다.

예외를 오용하지 않는 더 좋은 접근 방식을 제안 할 수 있습니까?


DateTimeFormatterBuilder.append 메소드 를 사용하여 여러 구문 분석기를 작성하고 빌더에 추가 할 수 있습니다 .

DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(),
        DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parsers ).toFormatter();

DateTime date1 = formatter.parseDateTime( "2010-01-01" );
DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );

Joda-Time은 여러 파서를 지정하여이를 지원합니다 -DateTimeFormatterBuilder # append

빌더를 사용하여 두 개의 포맷터를 만들고 toParser()각각을 호출하기 만하면 됩니다. 그런 다음 빌더를 사용하여 append.


불행히도 나는 Joda Time이 그러한 능력을 가지고 있다고 믿지 않습니다. "tryParseDateTime"메소드가 있으면 좋지만 존재하지 않습니다.

이 행동을 자신의 클래스 (패턴 목록을 가져와 차례로 시도하는 클래스)로 분리하여 추악함이 한곳에 만 있도록하는 것이 좋습니다. 이로 인해 성능 문제가 발생하는 경우 몇 가지 휴리스틱을 사용하여 먼저 시도 할 형식을 추측 할 수 있습니다. 예를 들어, 귀하의 경우 문자열이 숫자로 시작하면 아마도 첫 번째 패턴 일 것입니다.

참고 DateTimeFormatterJoda 시간에들 통상적으로 불변 - 당신은 새로운 당신이 줄을 구문 분석 할 때마다 생성 할 수 없습니다. 한 번 만들고 다시 사용하십시오.

참고 URL : https://stackoverflow.com/questions/3307330/using-joda-date-time-api-to-parse-multiple-formats

반응형