如果我运行下列程序,它分开两个日期线的参考时间1秒分开,并比较它们:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

产量是:

353

為什麼 ld4-ld3 不是 1 (正如我從一秒間的差異所期望的那樣),但 353?

如果我更改日期到时间1秒后:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";  

然后 ld4-ld3 将是 1.


Java 版本:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)
Timezone(`TimeZone.getDefault()`):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN

当前回答

首頁 〉外文書 〉文學 〉文學 〉Stop Press! History Changes

原始问题将不再表现出完全相同的行为,如果重建与2013a版本的TZDB. 在2013a,结果将是358秒,过渡时间为23:54:03而不是23:54:08.

我只注意到这一点,因为我在Noda Time中收集了类似的问题,以单位测试的形式......测试现在已经改变了,但它只是为了证明 - 甚至历史数据也不安全。

import java.util.TimeZone;

public class Test {
    public static void main(String[] args) throws Exception {
        long startOf1900Utc = -2208988800000L;
        for (String id : TimeZone.getAvailableIDs()) {
            TimeZone zone = TimeZone.getTimeZone(id);
            if (zone.getRawOffset() != zone.getOffset(startOf1900Utc - 1)) {
                System.out.println(id);
            }
        }
    }
}

上面的代码不会在我的Windows机器上产生任何输出。 因此,任何时间区,在1900年初除了它的标准一个没有任何折扣将计算为过渡。 TZDB本身有某些数据返回之前,并且不依赖任何“固定”标准时间的想法(这是什么 getRawOffset假设是一个有效的概念),所以其他图书馆不需要引入这个人工时间。

其他回答

我很抱歉说,但时间间断已经移动了一点。

JDK 6 兩年前,並在 JDK 7 最近更新 25.

学习的教训:以任何代价避免非UTC时间,除非可能显示。

当增加时间时,您应该转换为UTC,然后添加或提取。

这样,你就可以通过任何时间或分钟发生两次。

如果你转换到 UTC,添加每秒,并转换到当地时间显示. 你会通过 11:54:08 下午 LMT - 11:59:59 下午 LMT 然后 11:54:08 下午 CST - 11:59:59 下午 CST.

它永远不会是“1”的结果,因为 getTime()返回长毫秒,而不是几秒钟(其中353毫秒是公平的点,但日期的时代开始于1970年而不是1920年)。 cmmnt:您正在使用的API部分主要被认为是低估。

这个奇怪的道德是:

使用 UTC 的日期和时间在任何可能的地方. 如果您无法在 UTC 中显示日期或时间,请始终指示时间区. 如果您无法在 UTC 中要求输入日期/时间,请明确指示时间区。

您已遇到当地时间间隔:

当当地标准时间即将到达1928年1月1日星期日时,00:00时钟转向0:05:52小时到1927年12月31日星期六时,23:54:08当地标准时间。

这一点并不特别奇怪,因为由于政治或行政行动,时间区被交换或改变,几乎到处都发生了。