c - 为什么 Perl 的本地时间函数(和 C 的 tm 结构)中的年份值相对于 1900 年?

标签 c perl time

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

All list elements are numeric and come straight out of the C `struct tm'.

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

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

最佳答案

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

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

那些认为 Y2K 不是一个真正的问题因为什么都没发生的人并不了解事先几年修复问题的工作量。

关于c - 为什么 Perl 的本地时间函数(和 C 的 tm 结构)中的年份值相对于 1900 年?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935484/

相关文章:

c - 为什么 c 中的 scanf() 函数中的多个参数会使应用程序崩溃?

perl - 通过 Locale::Maketext::Simple 进行本地化总是回退到默认值而不是 .po 条目

java - If(语句)延迟

c++ - OpenCV中的kmeans和cvKMeans2算法有什么区别?

main 中声明的函数可以访问 main 中声明的变量吗?

perl - DBIx::Class 如何为 SQLite 启用 PRAGMA foreign_keys?

arrays - 创建根据另一个变量的内容命名的 Perl 哈希值

javascript - 如何在不知道 ID 的情况下清除所有 setInterval() 和 setTimeOut()?

python - 如何在 Python 中检索 UTC 时间?

c++ - 如果二维数组不是双指针,那为什么会这样呢?