【问题标题】:Why is the year value in Perl's localtime function (and C's tm struct) relative to 1900?为什么 Perl 的 localtime 函数(和 C 的 tm 结构)中的年份值相对于 1900?
【发布时间】:2012-02-14 16:02:56
【问题描述】:

所有 Perl 程序员(希望如此)都知道,调用 Perl 的 localtime 函数的年份值是相对于 1900 的。想知道为什么会这样,我查看了 perldoc for localtime,发现了这个有趣的块:

所有列表元素都是数字,直接来自 C `struct tm'。

然后查看C++ reference for the tm struct,我发现tm_year成员变量被声明为int

问题:那么,为什么年份值是相对于 1900 而不是完整的四位数年份?有什么历史原因吗?在我看来,即使在计算中存在早期内存限制,一个整数(显然)对于存储全年来说已经绰绰有余了。一定有充分的理由;我很好奇那可能是什么。

【问题讨论】:

  • 历史。在 70 年代初期,当事实上的标准被修复时,Y2K 漏洞并不是不言而喻的。在那之后,在不破坏大量代码的情况下更改它为时已晚。

标签: c perl time


【解决方案1】:

我在 1970 年代初开始编程,那时还没有发明 C 和 Unix。两位数的年份被用来节省非常非常紧张的磁盘空间,我们总是试图想出这样的技巧来节省它。我工作的第一台机器有两个 20 兆字节的驱动器,每个都有洗衣机那么大。

我在 1975 年曾在一家出现千年虫问题的医院工作。要知道患者的年龄很重要,而且出生日期只有两位数的年份。作为一家医院,我们显然有一些非常老的病人,他们出生于 1800 年代。该系统假设任何出生年份为 75 岁或以上的人都出生在 1800 年代。这对出生于 1890 年的人来说效果很好,但是一旦 1975 年 1 月 1 日来袭,一切都崩溃了,因为新生儿被认为是 100 岁。 (这也是一家大型妇产医院。)我们通过将阈值从 75 移动到 80 来解决这个问题。这也是我第一次了解 Y2K 会出现什么问题,我意识到我最好还是这样做到 2000 年,其他的事情。我失败了。

那些认为千年虫不是真正的问题,因为什么都没发生的人不了解之前几年修复问题的工作量。

【讨论】:

  • 作为后续问题,知道为什么tm_month 值是相对于 0 而不是相对于 1 吗?就像年份值一样,创建日期时要记住加1有点麻烦......
  • RE: tm_month,我一直听说tm_month 打算用作下标,如:@months = qw(Jan Feb Mar ... Dec); print $months[$tm_month];
【解决方案2】:

这是猜测。

在 Unix 发明时,使用的机器有 36 位字,其中一种流行的对这些字的解包是 4 个 9 位字符。如果 tm_year 设置为年 - 1900,则所有单独的 struct tm 字段都将适合 9 位无符号字符。那些旧机器上的内存非常紧张,因此将数据紧密打包到结构中比现在更令人担忧。

【讨论】:

    【解决方案3】:

    当计算机开始记录时间时,年份仅以 2 位数字表示。至于“为什么”部分,我没有听到任何明确的理由,除了“他们不必担心再过 30 年”。当时钟危险地接近 2000 年时,人们意识到他们的代码也需要跟踪 1999 年之后的时间,大多数软件仍然使用 2 位数年份(毕竟,让每个人都换成 4 位数会破坏很多代码,除非100% 交换)。避免 Y2K 错误的解决方法是将年份作为 1900 年的参考。

    这是其中一种情况,一开始就应该正确完成。 (QWERTY 键盘布局最初被设计为效率低下。此外,电子电路中的电流被规定为从 + 到 -,而实际上,电子实际上以相反的方式移动)。

    【讨论】:

    • 如果这里有人发明了时间机器,我们可以就待办事项列表达成一致吗?我一直想警告本杰明富兰克林不要走在正确的轨道上,但他的想法是错误的。
    • 当然不是电子从+移动到-,而是电势从+移动到-。 :-)
    • @R 你说对了一部分。 QWERTY 的设计效率低下。至于都市传说部分,一些消息来源声称 dvorak 并不比 qwerty 快。这些资料主要基于一项比较 qwerty 和 dvorak 打字员的研究(美国海军,iirc),但这项研究的记录很少,因此不知道打字员日常使用的字体样式.然而,QWERTY 时不时会显示出它的弱点,但这主要是针对单手打字,任何其他限制都不足以让我费心学习用新布局重新打字。
    • 我碰巧知道至少有一家公司存在“1980 年”问题。这就是记忆是多么短暂。 :)
    • QWERTY 布局was designedTH 等常用对分开放置,以尽量减少干扰。
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多