我写了一个Java应用程序,开始日期是特定年份的1月1日00:00。然后我增加了355天并一路打印出结果。我试图理解夏令时周围时区是如何工作的,如果添加1天是否会在进入夏令时时将时间从午夜转移到凌晨1点。我的代码如下:
TimeZone tz = TimeZone.getDefault();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
sdf.setTimeZone(tz);
Calendar cal = Calendar.getInstance(tz);
cal.set(2008, 0, 1, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
for ( int i = 0; i < 355; i++ ) {
System.out.println(sdf.format(cal.getTime()));
cal.add(Calendar.DAY_OF_MONTH, 1);
}
当在我的默认时区(美国东部)运行时,输出看起来与我预期的一样:
01/01/2008 00:00:00 EST
01/02/2008 00:00:00 EST
01/03/2008 00:00:00 EST
01/04/2008 00:00:00 EST
...
当我跨入夏令时时,会有
03/10/2008 00:00:00 EDT
03/11/2008 00:00:00 EDT
03/12/2008 00:00:00 EDT
当我使用一个遵循东欧夏令时的时区(在这种情况下,我选择了非洲/开罗时区),我会得到以下输出:
01/01/2008 00:00:00 EET
01/02/2008 00:00:00 EET
01/03/2008 00:00:00 EET
01/04/2008 00:00:00 EET
01/05/2008 00:00:00 EET
但是当我进入东欧夏令时,我收到以下信息:
04/25/2008 01:00:00 EEST
04/26/2008 01:00:00 EEST
04/27/2008 01:00:00 EEST
神奇的是,EEST结束后,我仍然会得到
08/29/2008 01:00:00 EET
08/30/2008 01:00:00 EET
我对这些时区为何表现不同感到困惑,不确定是非洲/开罗时区的错误还是我对时区工作原理的误解......如果您能提供任何见解,将不胜感激。