【问题标题】:Why when year is less than 1884, it remove few milliseconds?为什么当年份小于 1884 时,它会删除几毫秒?
【发布时间】:2013-01-11 16:28:15
【问题描述】:
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 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

【问题讨论】:

  • 不知道是不是类似this one的问题
  • @MikeChristensen 看起来像,但看到我的编辑,现在我真的很困惑。我想知道为什么 toString 的结尾部分意味着..
  • 最后一部分是与 UTC 的偏移量(取决于使用的时区)您的位置在 1884 年 1 月 11 日比 UTC 晚 8 小时,但比时间早 7 小时 52 分 58 秒区域已标准化。
  • @JoachimIsaksson 是否意味着没有时差?

标签: java date jodatime


【解决方案1】:

来自this time zone history page;

美国大陆的四个标准时区于 1883 年 11 月 18 日推出。英国已经在英格兰、苏格兰和威尔士采用了自己的标准时区,并在 1884 年帮助达成了全球时区的国际共识。

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

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

作为demo,你可以在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

【讨论】:

  • 很有趣,我无法用 C# 重现相同的内容,谁能告诉哪些语言实现了 7.02 秒的“修复”?
  • @torm 我猜这个修复可以被认为是正确的或错误的。据我了解,PST 是在该日期创建的,因此技术上 1883 年 1 月 11 日 PST 从来都不是任何地点的实际时间,尽管了解之前那个时间的时间可能很有用创建了 PST。时区让我头晕目眩。
  • @JoachimIsaksson 当然,我只是好奇为什么 7,02s(或任何值)以及为什么我知道的其他语言没有相同的东西。主要是因为,如果我理解正确,这意味着在 java 中当前日期时间 -200 年不应等于 C# DateTime -200 年,这在某些情况下可能会导致问题。
  • @torm 这很可能是时区与位置问题。很可能,您的时钟设置为PST,而JohnJohnGa 的时钟设置为America/Los Angeles。 PST 的时间不应该看到 7 分钟的变化,而洛杉矶的时间应该看到。
  • 您确定还是只是猜测不知道操作系统或 TimeZone 设置? :) 顺便说一句,我的操作系统 TZ 设置为 CEST,我使用 PST 创建了 DateTime 对象,您建议如何实现时间偏移?
【解决方案2】:

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

1883:美国和加拿大铁路采用五个标准化时区 在整个社区中替换多个当地时间 大陆。很快每个人都会在“铁路时间”上运作。

Source

Wikipedia page about Standard Time

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2018-12-28
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2021-06-26
    • 2021-08-26
    相关资源
    最近更新 更多