java - 为什么日期 1986/05/04 从 1 :00 but not 0:00 in java ( strange behaviours of calendar with the time zone - Shanghai )? 开始

标签 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]

最佳答案

这很正常,1986 年 5 月 4 日在中国没有 0:00。中国于该日期(1986/05/04)发生夏令时变更。快速谷歌一下this confirms it .

仅供引用,根据this page,中国在1986年至1991年间实行夏令时。他们不再观察它了。

关于java - 为什么日期 1986/05/04 从 1 :00 but not 0:00 in java ( strange behaviours of calendar with the time zone - Shanghai )? 开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755695/

相关文章:

java - 解压缩 gzip 压缩的 http 响应

javascript - 如何在特定位置的 div 上画一条线?

java - 如何仅从提供的小时数计算 Java 中的耗时

java - 不同Android版本中java.util.GregorianCalendar类的奇怪行为

java - 使用单一连接实例实现 Eclipse MQTT Android 客户端

java - 谷歌应用引擎 : maven or eclipse google plugin

java - API 设计中的响应/回复模式与方法重载

Android,监听器/观察器/日历事件更改回调

java - 自纪元以来时间不稳定的公历日历

java - 如何使用公历比较没有时间戳的日期?