Почему значение года в локальной функции Perl (и C tm struct) относительно 1900?
Как известно всем программистам на Perl, значение года от вызова функции Perl localtime
относится к 1900 году. Удивляясь, почему это было, я взглянул на perldoc для локального и нашел этот интересный самородок:
Все элементы списка являются числовыми и выходят прямо из C `struct tm '.
Если посмотреть на ссылку С++ для tm-структуры, я обнаружил, что переменная-член tm_year
объявлена как int
.
Вопрос: Почему же это значение года относительно 1900 года, а не просто полный четырехзначный год? Есть ли какая-то историческая причина? Мне кажется, что даже при ранних ограничениях памяти в вычислении целое число (очевидно) более чем достаточно для хранения полного года. Должно быть, была веская причина; Мне любопытно, что это может быть.
Ответы
Ответ 1
Я программировал в начале 1970-х годов, прежде чем были изобретены C и Unix. Два разряда были использованы для экономии дискового пространства, которое было очень плотным, мы всегда пытались найти такие трюки, чтобы сохранить его. На первом компьютере, на котором я работал, было два 20-мегабайтных диска, каждый размером с стиральную машину.
Я работал в больнице, у которой была проблема 2000 года в 1975 году. Возраст пациента - важная вещь, и дата рождения была только двухзначным годом. Будучи больницей, у нас, очевидно, были очень старые пациенты, родившиеся в 1800-х годах. Система предполагала, что каждый, чей год рождения составляет 75 лет, родился в 1800-х годах. Это хорошо сработало для людей, родившихся в 1890 году, но как только 1 января 1975 года, все хлыст разрывался, поскольку новорожденным считалось, что им исполнилось 100 лет. (Это был также крупный родильный дом.) Мы столкнулись с проблемой исправления этой проблемы, переместив порог с 75 до 80. Это было также мое первое понимание того, что будет проблемой Y2K, и я понял, что мне будет лучше делать что-то еще к 2000 году. Я потерпел неудачу.
Те, кто думают, что Y2K не были настоящей проблемой, потому что ничего не случилось, не понимают объем работы, которая была исправлена за несколько лет до этого.
Ответ 2
Когда компьютеры начали отслеживать время, в год были указаны только 2 цифры. Что касается "почему", я не слышал никакой определенной причины, кроме "Они не должны были бы беспокоиться об этом еще 30 лет". Когда часы стали опасно приближаться к 2000 году, и люди поняли, что их код необходим для отслеживания времени после 1999 года, большинство программных средств по-прежнему использовало 2-значные годы (после того, как все они заменили на 4 цифры, 100% обменивается). Обходной путь для уклонения от ошибки Y2K состоял в том, чтобы сделать год ссылкой на 1900 год.
Это один из таких случаев, когда это могло быть сделано в первую очередь. (Раскладка клавиатуры QWERTY изначально была неэффективной. Кроме того, ток в электронной схеме продиктован как переход от + к -, в то время как в действительности электроны фактически движутся противоположным образом).
Ответ 3
Это предположение.
Назад, когда была изобретена Unix, были машины, которые использовали 36-битные слова, а одна популярная распаковка этих слов - 4 9-битных символа. Если для параметра tm_year установлено значение год - 1900, то все отдельные поля struct tm будут помещены в 9-разрядные символы без знака. Память была очень плотной на этих старых машинах, поэтому плотная упаковка данных в структуры была более серьезной проблемой, чем сегодня.