2011-06-28 49 views
0

我模拟器设置为这个时区: org.apache.harmony.luni.internal.util.ZoneInfo["CET",mRawOffset=3600000,mUseDst=true]时区未检测DST

这是布鲁塞尔时间,那里有DST,所以我们GMT + 02:00在夏季和GMT + 01:00冬季。

然而,程序也没有办法检测DST于1970年7月,但它检测到它在2011年例如:

TimeZone tz = TimeZone.getDefault(); 

    if(tz.inDaylightTime(new Date(15638400000))){ //This timestamp is 01/07/1970 00:00:00:00 GMT 
     System.out.println("daylight time in July 1970"); //Not printed, despite being clearly in summer. 
    } 
    if(tz.inDaylightTime(new Date())){ // Now, 28/06/2011 
     System.out.println("daylight time in June 2011"); //printed, thats OK 
    } 

有什么不对的代码? 1970年没有DST?同样的事情发生在根据javadoc包含DST的偏移处:

int off = tz.getOffset(15638400000); //This returns +01:00, wrong!! 
    int off2 = tz.getOffset(System.currentTimeMillis()); //returns +02:00, OK. 

有关此行为的一些想法? 谢谢。

编辑: 我已经为这个时区做了一些测试,并且在1977年发现了第一个使用DST的夏天。毕竟,必须有一个开始日期来实施这项政策。然而,1977年似乎有点晚(石油危机在1970年和1973年)。我还没有找到任何官方文件证实这一点。

回答

1

不知道比利时,但在瑞典DST是1980年推出的,因此1970年比利时没有DST可能是正确的。 但是,如果真正了解DST对您的应用程序非常重要在1970年,那么您可能需要深入研究java.util.Date类的源代码或与java.util.GregorianCalendar的结果进行比较。

+0

这并不重要,但在其他平台(例如Blackberry)中,我收到了其他的行为,并且我试图明白为什么。遵循您的建议和我自己的好奇心,我挖掘了TimeZone源代码。发现TZ信息位于/system/usr/share/zoneinfo/zoneinfo.dat中的记录中,您可以使用adb进行记录。但是,我不知道它使用了哪种格式,所以它很难读。 –

+0

这对我来说也许很有趣,我在http://en.wikipedia.org/wiki/Tz_database上找到了一些信息,也可以在http://www.java2s.com/Open-Source/Java-Document/6.0- JDK模块太阳/ UTIL /阳光/ UTIL /日历/ ZoneInfoFile.java.java-doc.htm – Kennet

0

在真实设备(HTC Magic,OS 1.6)上测试,即使在1970年,它也检测到Brussels/CEST的DST。所以这是仿真器和真实设备之间不同行为的另一个例子。

我打算在更新的设备上再次测试它,看它是否存在跨操作系统版本的不同TZ数据库。

更新 在Samsung Galaxy Tab(OS 2.2)上测试,与HTC相同的行为。