SimpleDateFormat时区解析

问题描述:

我有一个艰难的时间解析这个日期它的+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

如果格式是一致的,你可以追加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,但抛开)

一种方法是使用普通字符串处理技术,将您的字符串从你期望的形式的形式把所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); 
}