2011-12-04 114 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這裏他們創建一個自定義的日期格式 – 2011-12-04 19:24:12

回答

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需要HH代替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已支持的任何內容,例如ESTGMT+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); 
}