为什么当年份小于1884年时,它删除了几毫秒?

2022-09-04 21:12:50
DateTime start = new DateTime().withYear(1884);
System.out.println(start);
System.out.println(start.minusYears(1));

输出

1884-01-11T08:26:10.234-08:00
1883-01-11T08:26:10.234-07:52:58

编辑1:我不正确。它没有删除1.02秒

DateTime start = new DateTime().withYear(1884);
DateTime other = start.minusYears(1);
long diffMs = start.getMillis() - other.getMillis(); //31536422000

编辑 2:

有趣的是,我被输出混淆了 - (,toString();-08:00-07:52:58)

编辑3:

使用Java Calendar,我没有看到任何差异:

Calendar cal = Calendar.getInstance();
cal.set(start.getYear(), 
        start.getMonthOfYear(), 
        start.getDayOfMonth(), 
        start.getHourOfDay(), 
        start.getMinuteOfHour(), 
        start.getSecondOfDay());
System.out.println(cal.getTime());

cal = Calendar.getInstance();
cal.set(start.getYear()- 1, 
        start.getMonthOfYear(), 
        start.getDayOfMonth(), 
        start.getHourOfDay(), 
        start.getMinuteOfHour(), 
        start.getSecondOfDay());
System.out.println(cal.getTime());

输出:

Mon Feb 11 18:46:42 PST 1884
Sun Feb 11 18:46:42 PST 1883

答案 1

在此时区历史页面;

1883 年 11 月 18 日,美国大陆引入了四个标准时区。英国已经为英格兰、苏格兰和威尔士采用了自己的标准时间系统,并在1884年帮助收集了全球时区的国际共识。

换句话说,美国时区在这两个时间戳之间发生了变化。

编辑:如果您的时区设置为PST(时区),则不会看到此效果,而如果您将其设置为某个位置(例如美国/Los_Angeles),则会。这是因为PST的时区偏移量没有改变,而是创建了PST,洛杉矶从LMT更改为PST)也就是说,洛杉矶时间发生了变化,而PST没有。

作为演示,您可以在Linux上尝试此操作;

# PST test
$ TZ=PST8PDT date -d '1883-01-01 12:00:00 UTC'
Mon Jan  1 04:00:00 PST 1883

# America/Los_Angeles test
$ TZ=America/Los_Angeles date -d '1883-01-01 12:00:00 UTC'
Mon Jan  1 04:07:02 LMT 1883

答案 2

今年美国采用了标准时间。

1883年:美国和加拿大铁路采用五个标准化时区,以取代整个非洲大陆社区中当地时间的多样性。每个人都将很快在“铁路时间”上运作。

关于标准时间的维基百科页面