Почему значение года в функции локального времени Perl (и структуре tm в C) относительно 1900? - PullRequest
15 голосов
/ 20 января 2012

Как известно всем программистам Perl (надеюсь), значение года от вызова функции Perl localtime относится к 1900 году. Интересно, почему это так, я взглянул на perldoc для локального времени ,и нашел этот интересный самородок:

Все элементы списка являются числовыми и взяты прямо из C `struct tm '.

Затем рассмотрим ссылку C ++для tm struct я обнаружил, что переменная-член tm_year объявлена ​​как int.

Вопрос: Почему тогда значение года относительно 1900а не просто полный, четырехзначный год?Есть ли какая-то историческая причина?Мне кажется, что даже при ранних ограничениях памяти в вычислениях целое число (очевидно) более чем достаточно для хранения полного года.Должно быть, была веская причина;Мне любопытно, что это может быть.

Ответы [ 3 ]

14 голосов
/ 20 января 2012

Я программировал в начале 1970-х, до того, как были изобретены C и Unix. Чтобы сэкономить место на диске, использовались двухзначные годы, и мы всегда старались придумать такие уловки, чтобы сохранить его. Первая машина, на которой я работал, имела два диска по 20 мегабайт, каждый размером со стиральную машину.

В 1975 году я работал в больнице, у которой была проблема 2000 года. Важно знать возраст пациента, а дата рождения имела год, состоящий только из двух цифр. Будучи больницей, у нас, очевидно, были очень старые пациенты, родившиеся в 1800-х годах. Система предполагала, что любой, чей год рождения был 75 лет или старше, родился в 1800-х годах. Это сработало хорошо для людей, родившихся в 1890 году, но после того, как 1 января 1975 года произошло поражение, все чертовски раскололись, так как считалось, что новорожденным было 100 лет. (Это также был крупный родильный дом.) Мы решили эту проблему, переместив порог с 75 на 80. Это было также мое первое понимание того, что будет проблемой Y2K, и я понял, что мне будет лучше сделать что-то еще к 2000 году. Я потерпел неудачу.

Те, кто думают, что Y2K не была реальной проблемой, потому что ничего не произошло, не понимают, сколько работы ушло на исправление в течение нескольких лет.

5 голосов
/ 20 января 2012

Когда компьютеры начали отслеживать время, год обозначался только двумя цифрами.Что касается части «почему», я не услышал какой-либо определенной причины, кроме «Они не должны были бы беспокоиться об этом в течение следующих 30 лет».Когда часы стали опасно приближаться к 2000 году, и люди поняли, что их код должен отслеживать время и после 1999 года, большинство программного обеспечения по-прежнему использует 2-значные годы (в конце концов, если каждый поменяется на 4 цифры, это порвет много кода, еслиПоменялся на 100%).Обходной путь для уклонения от ошибки 2000 года состоял в том, чтобы сделать год ссылкой на 1900 год.

Это один из тех случаев, когда это можно было бы сделать правильно с самого начала.(Раскладка QWERTY-клавиатуры изначально была спроектирована как неэффективная. Кроме того, ток в электронной схеме определяется как идущий от + к -, в то время как на самом деле электроны движутся в противоположном направлении).

4 голосов
/ 20 января 2012

Это предположение.

Назад, когда Unix был изобретен, были машины, которые имели 36-битные слова, и одна популярная распаковка этих слов была 4 9-битными символами.Если для tm_year задан год - 1900, то все отдельные поля struct tm будут помещаться в 9-разрядные символы без знака.Память на этих старых машинах была очень ограничена, поэтому плотная упаковка данных в структуры была более важной задачей, чем сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...