Android中的Java日历可能是错误的

时间:2012-11-23 18:13:56

标签: java android calendar

以下代码无法在Android模拟器下传递断言:

TimeZone timezone = TimeZone.getTimeZone("Hongkong");
Locale locale = new Locale("zh", "HK"); 
Calendar calendar = Calendar.getInstance(timezone, locale);

calendar.set(Calendar.YEAR, 1979);
calendar.set(Calendar.MONTH, 4);        
calendar.set(Calendar.DAY_OF_MONTH, 13);            
calendar.set(Calendar.HOUR_OF_DAY, 4);  
calendar.set(Calendar.MINUTE, 30);      
calendar.set(Calendar.SECOND, 0);        

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
df.setTimeZone(timezone);
String sDate = df.format(calendar.getTime());

int debug = calendar.get(Calendar.HOUR_OF_DAY);
Assert.assertEquals("Error datetime: " + sDate, 4, debug);

我发现,如果将DAY_OF_MONTH更改为12,则错误消失:     calendar.set(Calendar.DAY_OF_MONTH,12);

请注意,JUnit测试中不存在此问题。 (没有Android)

最后,这个问题似乎可能不存在于Android真机上。

有任何意见吗?

1 个答案:

答案 0 :(得分:0)

我相信,这是因为这种转变:

  

香港在1941年采取了夏令时措施。然而,在二十世纪七十年代,政府认为这些措施是不必要的,因为香港的纬度相对较低。 1979年取消了这种做法

这是DST在1979年5月13日发生的变化。

  

1979年5月13日星期日 3:29:59 AM没有UTC + 8小时HKT

     

3:30:00 AM→4:30:00 AM + 1h UTC + 9h HKST DST开始

     

1979年10月21日星期日凌晨3:29:59 + 1小时UTC + 9小时HKST

由于香港的DST开启和关闭,最后关闭,这可能是问题的根本原因。