Чому Unix зберігає часові позначки в підписане ціле число?


24

Чому підписане ціле число використовується для представлення часових позначок? Є чітко визначений початок з 1970 року, який представлений як 0, тож навіщо нам потрібні цифри до цього? Чи використовуються де-небудь негативні позначки часу?


2
Ось чому Нострадамус не міг використати свій комп’ютер для написання своїх прогнозів на роки 3000 + ... це призведе до переповнення та показує його дати як негативні. Я думаю, що вони назвали це помилкою Y3K або щось таке!
Jeach

3
У древніх римлян була ще гірша проблема, коли число років перейшло з негативного на позитивне. Вони б назвали це проблемою Y0K, якби вони мали спосіб виразити число нуль. 8-)}
Кіт Томпсон

Відповіді:


35

Ранні версії C не мали підписаних цілих чисел. (Деякі програмісти використовували покажчики тоді, коли їм потрібна непідписана арифметика.) Я не знаю, який був першим, time()функція або неподписані типи, але я підозрюю, що представлення було встановлено до того, як неподписані типи були загальнодоступними. І 2038 рік був досить далеким у майбутньому, що його, мабуть, не варто було турбувати. Я сумніваюся, що багато людей думали, що Unix до цього часу ще існуватиме.

Ще одна перевага підписаного time_tполягає в тому, що розширення його на 64 біти (що вже відбувається в деяких системах) дозволяє представляти кілька разів на кілька сотень мільярдів років у майбутнє, не втрачаючи можливості представляти часи до 1970 року. (Тому я проти того, щоб перейти на 32-розрядний без підпису time_t ; у нас є достатньо часу для переходу до 64 біт.)


7
Ця timeфункція є старшою за епоху: Unix v1 (1971 р.) Рахується в одиниці 1/60 секунди, починаючи з півночі 1971/01/01. Це було вже відомо , що помилка «Хронологічний - мислячих користувач помітить , що 2 ** 32/60 від asecond становить лише близько 2,5 років.» unsigned Було введено K & R в 1978 році , а після 1970 епохи була створена.
Жил "ТАК - перестань бути злим"

Я зробив швидкий тест і на моєму 64-бітному скриньці Linux. gmtimeі localtimeмаксимум у році 2147483647 (з наступною секундою після дати -2147483648 як рік). Таким чином, щоб значно перевищити 55 біт часу, комусь доведеться оновити вихідну процедуру, щоб використовувати 64-бітний інт на рік замість непідписаного 32-бітного int. Сподіваємось, хтось подбає про цю помилку десь у найближчі пару мільярдів років.
freiheit

@freiheit: Цікаво. Проблема полягає в тому, що struct tmтип має член tm_year(представляє роки з 1900 року), який є типом int. 64-бітні системи можуть легко мати 64-розрядні time_t, але вони, як правило, мають 32-розрядні int. (Якщо char8 біт і intце 64 біт, то це shortможе бути або 16, або 32 біт, і для іншого розміру не буде визначеного типу.) Але time(), мабуть, єдина функція, <time.h>яка дійсно вимагає підтримки на рівні системи; ви можете написати власний код, щоб перетворити time_tзначення в рядки, прочитані людиною.
Кіт Томпсон

12

Це підтримувати часові позначки та дати до 1 січня 1970 року.


1
Це становить лише 68 років у минулому - 1902 р. Це здається зовсім небагато.
Бакудан

2
POSIX не вимагає time_tлише 32 біт; це вже 64 біти для багатьох систем.
Кіт Томпсон

1
mktime()функція повертається -1у випадку помилки, тому, ймовірно, неможливо розрізнити правильні часові позначки до 1970-01-01 та помилки ts. Заборонені дати до 1970-01-01 заборонені
DimG

@DimG: Важко відрізнити помилку від конкретної часової позначки 1969-12-31 23:59:59 UTC. Негативне значення, відмінне від -1однозначного.
Кіт Томпсон

1
@mtraceur: Стандарт C не потребує встановлення невдалого mktime()дзвінка errno. (POSIX робить.)
Кіт Томпсон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.