2012-02-28 2 views
3

나는 String처럼 보이는 Date를 가지고 있으며 그것을 파싱하고 싶습니다.
날짜는 여러 가지 패턴 중 하나처럼 보일 수 있습니다.parse joda-time

MM/dd/yy 

또는

HH:mm 

또는

MM/dd/yy HH:mm 

또는 구문 분석 할 수

MM/dd/yy HHmm 

내가 코드를

, 많은 패턴

public DateTime parseDateTime(final String text) 
    { 
     if (StringUtils.isEmpty(text)) return null; 
     int field = 0; 
     DateTime dateTime = null; 
     IllegalArgumentException exception = null; 
     for (; field < FIELD_COUNT; ++field) 
     { 
     if (null != formatters[field]) 
     { 
      try 
      { 
       dateTime = formatters[field].parseDateTime(text); 
       break; 
      } 
      catch (final IllegalArgumentException e) 
      { 
       exception = null != exception ? exception : e; 
      } 
     } 
     } 
     if (dateTime == null) 
     { 
     throw exception; 
     } 
     return dateTime; 
    } 

formatters[]

DateTimeFormatter 

의 배열이 다른 방법을 제안 할 수있다? 더 간단함

+0

인터넷 검색 나에게 [POJava] (http://www.pojava.org)라는 라이브러리를 알려주는 휴리스틱 날짜/시간 파서가 포함되어 있습니다. org/site/pojava-2.8.0/apidocs/org/pojava/datetime/DateTime.html을 참조하십시오. 이 작업을 수행하는 또 다른 라이브러리는 파이썬의 [dateutil] (http://labix.org/python-dateutil)이지만 분명히 노력해야 할 가치가없는 것을 포팅해야합니다. – millimoose

+0

당신의 접근 방식은 읽기 쉽고 유지 보수가 가능합니다. '포맷터'를 초기화하면 지원되는 패턴을 한눈에 알 수 있습니다. 다른 코드를 변경하지 않고 패턴을 추가하고 제거 할 수 있습니다. 당신이 지금 가지고있는 것과 '단순한'대안을 비교하는 것은 가치가 있습니다. –

답변

0

첫 번째 패턴에는 공백이없고 콜론이 없습니다.

두 번째 것은 콜론을 포함하지만 공백은 포함하지 않습니다.

세 번째 것은 공백과 콜론을 포함합니다.

마지막에는 공백이 있지만 콜론은 없습니다.

따라서 두 번의 indexOf() 호출을 사용하면 적용 할 패턴을 결정할 수 있어야합니다.

또 다른 방법은 모든 패턴 (8, 5, 14 및 13)에서 다른 문자열의 길이를 사용하는 것입니다.

+0

좋은 생각이지만 간단하지는 않습니다. joda-API에는 이미 많은 패턴을 사용하는 메서드가 포함되어 있습니다. – Ilya

0

SimpleDateFormat 클래스는 지정한 문자열 형식의 날짜를 구문 분석 할 수 있습니다. 형식 규칙의 경우, 모든 형식 필드가 구문 분석 된 경우 구문 분석에 후행 문자를 무시할 수 있기 때문에

try 
    { 
     DateFormat df = new SimpleDateFormat("MM/dd/yy HHmm"); 
     Date date = df.parse("03/29/12 2359"); 
     System.out.println(date); 
    } 
    catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

, 가장 긴/가장 복잡한 하나를 시작하면 javadoc

예를 들어 볼 최단로 끝/가장 간단한 것. 예외를 throw하지 않는 첫 번째 항목을 가져옵니다. 귀하의 경우에는

: HTTP : //www.pojava

{ 
new SimpleDateFormat("MM/dd/yy HH:mm"), 
new SimpleDateFormat("MM/dd/yy HHmm"), 
new SimpleDateFormat("MM/dd/yy"), 
new SimpleDateFormat("HH:mm") 
}