繁体   English   中英

为什么Perl的localtime函数(和C的tm结构)中的年份值相对于1900?

[英]Why is the year value in Perl's localtime function (and C's tm struct) relative to 1900?

正如所有Perl程序员(希望)都知道的那样,调用Perl的localtime函数的年份值相对于1900年。想知道为什么会这样,我看了一下perldoc for localtime ,并找到了这个有趣的块:

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

然后看一下tm结构C ++引用 ,我发现tm_year成员变量被声明为int

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

在C和Unix发明之前,我在1970年代早期编程。 两位数的年份用于节省非常紧张的磁盘空间,我们总是试图用这样的技巧来保存它。 我工作的第一台机器有两个20兆字节的驱动器,每个驱动器都是一台洗衣机。

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

那些认为Y2K不是真正问题的人,因为什么都没发生,所以不了解事先几年修理东西的工作量。

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

这是其中一个案例,它本来应该是正确的。 (QWERTY键盘布局最初设计效率低。而且,电子电路中的电流被指定为从+到 - ,而实际上,电子实际上是以相反的方式移动)。

这是猜测。

当Unix被发明时,使用的机器有36位字,而这些字的一个流行的解包是4个9位字符。 如果将tm_year设置为year - 1900,那么所有单独的struct tm字段将适合9位无符号字符。 这些旧机器的内存非常紧张,因此将数据紧密地打包到结构中是一个比现在更大的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM