SimpleDateFormat忽略Android中的DST偏移

时间:2012-10-03 19:11:04

标签: java android time timezone

在中欧,目前的时区(截至10月3日)是:

CEST / UTC + 2

但是当我现在在Android中创建SimpleDateFormat的实例时......

dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

...它返回CET / UTC+1作为时区。所以它忽略了目前必须仍然存在的DST偏移。这是为什么?

此外,当使用getTimezoneOffset()实例的(现已弃用)方法Date时,它会返回不一致的结果:

(new Date()).getTimezoneOffset()正确返回-120(2小时),而dateTimeFormat.parse("2012-10-03T22:00:00.000+0000").getTimezoneOffset()返回-60(1小时)。

这怎么可能发生?我做错了什么或这是一个已知的错误?

注意:我听说有些库可以提供更好的时间计算(例如Joda Time),而且我现在经常听到这种情况;)但是使用一些变通方法,你可以轻松使用内置的Java时间库。

当然,我的机器上正确设置了时区。

2 个答案:

答案 0 :(得分:1)

我刚刚切换到JODA很棒。

它在Android上运行良好,此链接中包含以下注释: Android Java - Joda Date is slow 这使它运行得更快。

答案 1 :(得分:1)

我不知道我是否正确理解了您的用例,但是从我在尝试此代码时所理解的情况来看。

public static void main(String[] args) {
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        String date="2012-10-03T22:00:00.000+0000";
        try {
            System.out.println(dateTimeFormat.getTimeZone().getDisplayName());
            System.out.println("Today : "+new Date().toString()+ ", Timezone Offset :" +
                    +(new Date()).getTimezoneOffset());
            System.out.println("Parsed Date : "+
                    dateTimeFormat.parse(date).toString()
                    + ", Timezone Offset : "
                    +dateTimeFormat.parse(date).getTimezoneOffset());           
        } catch (ParseException e) {            
            e.printStackTrace();
        }
    }

我得到了一致的输出,即:

Central European Time
Today : Wed Oct 03 09:44:56 CEST 2012, Timezone Offset : -120
Parsed Date : Wed Oct 03 23:00:00 CEST 2012, Timezone Offset : -120