Java Android中忽略DST偏移的SimpleDataFormat

Java Android中忽略DST偏移的SimpleDataFormat,java,android,time,timezone,Java,Android,Time,Timezone,在中欧,当前时区(截至10月3日)为: CEST/UTC+2 但是当我现在在Android中创建一个SimpleDataFormat实例时 dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 。。。它返回CET/UTC+1作为时区。因此,它忽略了DST偏移量,目前它必须仍然存在。为什么会这样 此外,当使用Date实例的getTimezoneOffset()方法(现在已弃用)时,它会返回不一致的结果: (新日期

在中欧,当前时区(截至10月3日)为:

CEST/UTC+2

但是当我现在在Android中创建一个
SimpleDataFormat
实例时

dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
。。。它返回
CET/UTC+1
作为时区。因此,它忽略了DST偏移量,目前它必须仍然存在。为什么会这样

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

(新日期()).getTimezoneOffset()正确返回-120(2小时),而
dateTimeFormat.parse(“2012-10-03T22:00:00.000+0000”).getTimezoneOffset()返回-60(1小时)

这怎么会发生?我是做错了什么,还是这是一个已知的错误


注意:我听说有一些库提供更好的时间计算(例如Joda time),我现在经常听说;)但是使用一些变通方法,您可以同样轻松地使用内置的Java时间库


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

我刚刚切换到JODA,它很棒

它在Android上也能很好地工作,在下面的链接中有评论:
这使它运行得更快。

我不知道我是否正确理解了您的用例,但根据我在尝试此代码时所理解的内容

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

我也发现了Java时间类中的不一致性,现在只将Calendar类用于与日期时间相关的任何内容。到目前为止,它每次都对我有效,甚至在处理不同地区不同的公历日期转换时有广泛的逻辑。我手头上总是有3个静态实例,一个设置为UTC,一个设置为系统时区,还有一个浮动实例,我可以在其中计算我需要的任何内容(例如,用户正在漫游,但将设备留在了他们的主时区)。我给它们取了一个恰当的名字,这样我就永远不会感到困惑:)谢谢!我也在使用
gregoriacalendar
,但是对于解析,我需要使用
SimpleDateFormat
,不是吗?或者是否有任何方法可以将日期字符串直接解析到
日历
实例?将字符串解析为
Date
实例后,我创建了一个
Calendar
实例。顺便说一句,在本例中,导致问题的是
SimpleDateFormat
,而不是
Date
类。同意。仔细考虑我的用例,在我的应用程序中,用户从不输入日期。他们可以从日历中选择日期,但仅此而已。要做到这一点,请使用他们的系统时区(我不考虑漫游),并用GETTimeZONE().GETOFFSET()转换为UTC。之后的所有操作都是在UTC中使用历元完成的,直到我在适当的日历上简单地设置timeinmillis并在日历上使用日期格式化程序时,显示根据用户偏好(使用系统/使用UTC)完成的操作。这样,格式化程序就没有时区的概念,“您可以同样轻松地使用内置Java时间库”-不,您不能同样轻松地使用它。使用Joda的好处是巨大的。也就是说,很明显,普通的课程也应该起作用。你能给出一个简短但完整的代码示例,以及输入/输出吗?您已经给出了一些细节,但是完整的示例代码将非常有用——特别是如果您可以在桌面Java和Android上给出结果的话。谢谢!我现在很困惑。得到与您相同的输出,但我确信在这里提问之前,我得到了不同的输出。无法再复制错误的输出,所以问题解决了。奇怪。