为什么1986/05/04的日期从1点开始而不是从0点开始(日历与时区的奇怪行为 - 上海)?

时间:2013-12-24 06:03:50

标签: java calendar gregorian-calendar

嗨〜当我试图获得两个日期之间的间隔时,我遇到了一个奇怪的问题。问题是当日期 1986/05/04 在我的计算中使用的两个日期之内时,结果小于我想要的结果。这都是因为1986/05/04从 1:00 开始,但不是0:00,这是测试代码:

public static void main( String[] args )
{
    Calendar bc = new GregorianCalendar( 1986, 4, 4, 0, 0, 0 );
    Calendar ec = new GregorianCalendar( 1986, 4, 5, 0, 0, 0 );
    System.out.println( "bch: " + bc.get( Calendar.HOUR_OF_DAY ) + " bcm: " + bc.get( Calendar.MINUTE )
            + " bcs: " + bc.get( Calendar.SECOND ) + " bcms: " + bc.get( Calendar.MILLISECOND ) );
    System.out.println( "ech: " + ec.get( Calendar.HOUR_OF_DAY ) + " ecm: " + ec.get( Calendar.MINUTE )
            + " ecs: " + ec.get( Calendar.SECOND ) + " ecms: " + ec.get( Calendar.MILLISECOND ) );
    System.out.println( "Interval: " + ((ec.getTimeInMillis() - bc.getTimeInMillis())) );
}

,输出为:

bch: 1 bcm: 0 bcs: 0 bcms: 0
ech: 0 ecm: 0 ecs: 0 ecms: 0
Interval: 82800000

我想要86400000.你可以看到虽然我在1986/05/04将小时设置为0,但它仍然没用。我真的无法理解结果,并想知道格里高利历中是否有一些我不知道的特殊规则,或者它只是格里高利历的一个错误。如果你能帮助我,我将不胜感激。

环境:

JRE 1.6
ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]

1 个答案:

答案 0 :(得分:7)

这是正常的,1986年5月4日中国没有0点。在中国这个日期(1986/05/04)有一个白天节省时间的变化。关于this confirms it的快速谷歌。

仅仅是为了获取信息,根据this page,中国观察到1986年至1991年间的夏令时节省时间。他们不再观察它了。