我可以将一个SimpleDateFormat模式用于带有“Z”和“+1:00”后缀的日期吗?

时间:2012-03-26 20:03:19

标签: java android simpledateformat dst

我拨打返回GMT日期的服务。它自11月以来一直运作良好,但现在夏令时活跃,它失败了。以下是非夏令时的样本日期:

2011-12-07T15:50:01Z

从今天开始(夏令时):

2012-03-26T11:05:01+01:00

以前我一直在使用这种模式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.UK);

但它在第二个日期失败了ParseExcepton(“Unparsable date ...”)。那么,一种模式可以用于两者,如果是这样,它是什么?如果我不能同时使用一种模式,那么上面第二个日期的正确模式是什么?

它不应该有所作为,但如果确实如此,则在Android平台上使用它。

3 个答案:

答案 0 :(得分:2)

你使用Android肯定会有所不同,因为如果你使用的是Java 5/6或7,它会对这种情况产生影响。

您正在使用的模式指定要解析的文字“Z”(也称为“T”)。它不是解析时区。您需要从'Z'周围删除单引号以开始解析实际时区。

根据Android JavaDoc,目前尚不清楚大写Z是否会在这种情况下起作用,因为小时/分钟的格式非常具体。我对Android SDK的确认不够了解,但结果肯定会对标准Java产生影响。

答案 1 :(得分:2)

新的ISO8601时区模式由Java 7中引入的X模式说明符涵盖。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.UK);

如果您仍然在Java 6或更早,那么可能会有所不同。您需要自己解析(部分)或抓住Joda Time

答案 2 :(得分:1)

如果您使用java6,则必须识别模式,然后应用formater

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
    String date2Str="2011-12-07T15:50:01Z";
    Date date2 = df.parse(date2Str);
    System.out.println(date2.toString());

    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    String date1Str="2012-03-26T11:05:01GMT+01:00";
    Date date1 = df2.parse(date1Str);

    System.out.println(date1.toString());