2011-12-04 2 views
2

이 날짜를 구문 분석하기가 힘들어서 문제를 일으키는 끝에 +0이 있습니다. 다른 사람이 내 형식 문자열에 문제가있는 것을 알고 있습니까? 날짜 문자열에서 +0을 제거하고 형식 문자열에서 Z를 제거하면 불행하게도 옵션이 아닌 내 응용 프로그램에서 제대로 작동합니다. 형식이 일관된 경우SimpleDateFormat 시간대 구문 분석

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SimpleDateFormat dateFormater = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss zZ"); 
     try { 
      Date d = dateFormater.parse("Sun, 04 Dec 2011 18:40:22 GMT+0"); 
      System.out.println(d.toLocaleString()); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

http://home.tiscali.nl/bmc88/java/ sbook/035.html 여기에서 사용자 정의 날짜 형식을 만듭니다. –

답변

2

, 당신은 날짜 문자열에 0:00을 추가 할 수있다.

String dateString = "Sun, 04 Dec 2011 18:40:22 GMT+0"; 
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH); 
Date date = sdf.parse(dateString + "0:00"); 
System.out.println(date); 

(그렇지 않으면 기본 로케일로 영어를 사용하지 않는 플랫폼에서 실패 할 수 있습니다, 내가 명시 적으로 주 및 달 이름의 일을 구문 분석하는 데 사용되는 로케일을 지정 SimpleDateFormat 건설을 고정 있습니다; 그렇게하지 않으면 나는 또한 actually 대신 kkHH 필요 궁금하지만, 그 옆)

3

한 가지 방법은 폼에 기대하고 폼에서 문자열을 번역하는 일반 문자열 조작 기술을 사용하는 것입니다 SimpleDateFormat을 이해합니다. GMT를 지원하는 것

private static Date parse(String dateString) throws ParseException 
{ 
    final SimpleDateFormat dateFormat = 
     new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss Z"); 
    dateString = dateString.replaceAll("(GMT[+-])(\\d)$", "$1\\0$2"); 
    dateString = dateString.replaceAll("(GMT[+-]\\d\\d)$", "$1:00"); 
    return dateFormat.parse(dateString); 
} 

플러스 또는 마이너스 한 또는-두 자리 시간 오프셋 : 당신은 시간대 형식의 어떤 범위는 허용하지만, 하나의 가능성 같은 것을 정확히 말했다하지 않은 또한 SimpleDateFormat으로 이미 지원되는 항목 (예 : EST 또는 GMT+1030)을 계속 지원할 수 있습니다.

양자 택일로, 당신은 항상 다음 방금 포맷터 시간대를 설정하고, 문자열의 시간대 무시할 수, GMT 될 것입니다 알고있는 경우 :

private static Date parse(String dateString) throws ParseException 
{ 
    final SimpleDateFormat dateFormat = 
     new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss"); 
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
    return dateFormat.parse(dateString); 
} 

당신은 또한 분할 할 수 있습니다 차. 문자열의 표준 시간대 형식이 TimeZone.getTimeZone()과 일치하는지 확인합니다. 그게 의도적 인거야? 그렇다면, 당신은 사전에 dateFormat.setTimeZone에 전달, 문자열에서 그 시간대 형식을 잡아하고 실제 구문 분석하는 동안 무시할 수 :

private static Date parse(final String dateString) throws ParseException 
{ 
    final SimpleDateFormat dateFormat = 
     new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss"); 
    if(dateString.indexOf("GMT") > 0) 
     dateFormat.setTimeZone 
     (
      TimeZone.getTimeZone 
       (dateString.substring(dateString.indexOf("GMT"))) 
     ); 
    return dateFormat.parse(dateString); 
}