2012-02-01 2 views
3

특정 사용자 지정 형식으로 날짜를 구문 분석하려고합니다.자바에서 사용자 지정 데이터 형식을 파싱했습니다.

수요일 25 JAN 2012 -이 같은 오후 12시 44분 7초

..

나는 이것에 대한 SimpleDateFormat을 만들어 ..

SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD MMM YYYY - HH:MM:SS aa"); 

문제가있다 일 동안 리터럴. 25 번째, 23 번째, 02 번째처럼오고 있습니다.이 문제에 대한 예외가 생깁니다 ...

이 문제를 극복하는 방법을 도와주세요.

+0

D는 올해의 날 (:) 내가 다른 곳에서 왔어요, 로케일 무시), D는 .. 달에 하루 http://docs.oracle.com/javase/7 /docs/api/java/text/SimpleDateFormat.html – L7ColWinters

+3

가능한 복제본 [Java에서 "11th", "21st"또는 "23rd"라고 말하기 위해 날짜를 어떻게 구성합니까?] (http : // stackoverflow. com/questions/4011075/how-do-you-format-the-month-to-say-11th-21-or-23rd-in-java) – kosa

+0

질문은 출력 방법이 아닙니다. * "th", "st"또는 "rd"; 그러나 그것을 문자열에서 파싱하는 방법. – nybbler

답변

2

이 스레드에 명시된 것을 다음

String text = "WEDNESDAY 21st JAN 2012 - 12:44:07 PM"; 
String[] parts = text.split(" ", 3); // we only need 3 parts. No need splitting more 
parts[1] = parts[1].substring(0, 2); 
String parseableText = String.format("%s %s %s", parts[0], parts[1], parts[2]); 
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss aa"); 

try { 
    java.util.Date dt = sdf.parse(parseableText); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

구문 분석 문자열에 오류가 있습니다. 대/소문자는 날짜와 시간 부분에 중요합니다. 참조 용으로 SimpleDateFormat javadoc을 참조하십시오.

+0

nybbler 하위 문자열을 만들고 있습니까? thats 괜찮아요.하지만 거기에 어떤 옵션을 그래서 내가 그것을 패턴화할 수있는 단지 두 문자 때문에 우리는 와일드 카드 문자를 사용할 수 없습니다? – karthik

+0

@karthik 내가 아는 것은 아닙니다. try..catches 3를 두 캐릭터의 3 가지 가능성을 포개기 위해 깊이 중첩시킬 수 있다고 가정합니다.하지만 그건 내 접근 방식이 아닙니다.우리가 예를 들어 텍스트로만 '일'을있는 경우에 우리는이 SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD'th' MMM YYYY - HH:MM:SS aa"); 처럼 SimpleDateFormat의 에 상수 값을 제공 할 수 있는지 내가 생각했던 – nybbler

+0

. 와일드 카드 문자를 사용할 수있는 방법이없는 이유는 'rd'또는 다른 두 개의 문자와 일치 할 수 있기 때문입니다. 옵션이있는 경우 dateStr에 "thursday 5th"가 있고 "ursday 5th"가되지 않으면 – karthik

0

추가 형식 문자열에 ".TH"사람들이 당신이 부분으로 분석하고 문제를 일으키는 두 문자를 제거하려는 날짜 문자열을 분할 할 수

How do you format the day of the month to say "11th", "21st" or "23rd" in Java? (ordinal indicator)

+0

그것은 11 월 3 일에 올 수 있습니다 또는 21 일 올 수 있습니다 ...하지만 그것은 단 두 문자가있을 것입니다 어떤 옵션을 – karthik

+0

난 당신이 진술 스레드를 생각하지 않아요 여기에 언급 된 문제에 대한 우려 – karthik

+0

나는 그것이 OPF를 분석하고자하는 날짜 문자열을 처리 할 수있는 SDF 형식을 만드는 방법을 보여주기 때문에 그렇게한다고 생각합니다. 사람들이 포맷하고 싶은 스레드에서 구문 분석을 원하지만 둘 다 n 번째, 2 번째, 3 번째 등의 SDF를 사용하고 싶습니다. – Alfabravo

1

어떻게 든 수동으로해야 할 것입니다.

public static String makeItParseable(String dateStr) { 
    if(dateStr.contains("st ")) { 
     return dateStr.replace("st ", " "); 
    } else if(dateStr.contains("nd ")) { 
     return dateStr.replace("nd ", " "); 
    } else if(dateStr.contains("rd ")) { 
     return dateStr.replace("rd ", " "); 
    } else { 
     return dateStr.replace("th ", " "); 
    } 
} 

을 그리고 그것은 입력 문자열을 구문 분석 할 사용 :하는 방법으로 다음과

String dateStr = "WEDNESDAY 1st JAN 2012 - 12:44:07 PM"; 
dateStr = makeItParseable(dateStr); 
DateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss a"); 
Date date = dateFormat.parse(dateStr); 
+0

의 하위 문자열을 사용할 수 있습니다. –

+0

@vivek_jonam : 그렇게해서는 안된다고 생각하지만 시도해 보셨습니까? –

+0

그것은 그 오류를 만들지 않았다. "th"의 뒤에 공백을 알아 차리지 못했다. –

3

당신은이 같은 정규식을 사용하여 하루 동안 문자를 제거 할 수 있습니다.

String dateString = "WEDNESDAY 25th JAN 2012 - 12:44:07 PM"; 
SimpleDateFormat format = new SimpleDateFormat("EEEEEEE dd MMM yyyy - HH:mm:ss aa", new Locale("EN")); 
dateString = dateString.replaceAll("(.*[0-9]{1,2})(st|nd|rd|th)(.*)", "$1$3"); 
Date parsedDate = format.parse(dateString); 

System.out.println(parsedDate); 

+0

멋진 일 ... 모든 reg ex 수행 방법을 잘 모릅니다 ... 곧 설명 할 수 있습니까? – karthik

+0

괄호 안에있는 세 표현식은 캡처 그룹입니다. 첫 번째 그룹은 임의의 문자 뒤에 1 또는 2 자릿수 (하루 리터럴 이전의 모든 문자)를 캡처합니다. 두 번째 그룹은 가능한 모든 4 자리 숫자를 모델링합니다. 세 번째 그룹은 리터럴 뒤에 오는 모든 것을 나타냅니다. 대체 문자열에서 그룹 1과 3을 함께 붙입니다. 기본적으로 전체 문자열을 첫 번째 부분과 세 번째 부분을 연결하여 바꿉니다. – mtsz

관련 문제