2011-12-04 15 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建設を固定していることに注意してください。あなたはactuallyHH代わりのkkを必要としないが、それはさておき)

3

一つのアプローチは、そのフォームにあなたが期待しているフォームからあなたの文字列を変換するために、通常の文字列操作技術を使用することであれば、私も疑問に思いますSimpleDateFormatがわかります。

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); 
} 

オフセットGMTプラスマイナス一または二桁の時間をサポートしています:あなたは許容されるが、一つの可能​​性は、このようなものであるタイムゾーン形式のまさに範囲としていませんまた、すでに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); 
} 
関連する問題