Почему целое число со знаком используется для представления меток времени? В 1970 году четко определено начало, обозначенное как 0, так зачем нам нужны цифры до этого? Используются ли где-нибудь отрицательные метки времени?
timestamps
Bakudan
источник
источник
Ответы:
Ранние версии C не имели целых чисел без знака. (Некоторые программисты использовали указатели, когда им требовалась арифметика без знака.) Я не знаю, что было первым,
time()
типы функций или без знака, но я подозреваю, что представление было установлено до того, как типы без знака стали общедоступными. И 2038 год был достаточно далеко в будущем, о котором, вероятно, не стоило беспокоиться. Я сомневаюсь, что многие думали, что Unix все еще будет существовать к тому времени.Другое преимущество подписанного
time_t
состоит в том, что расширение его до 64 бит (что уже происходит в некоторых системах) позволяет вам представлять времена в несколько сотен миллиардов лет в будущем, не теряя возможности представлять времена до 1970 года. (Вот почему я против перехода на 32-разрядный без знакаtime_t
; у нас достаточно времени для перехода на 64-разрядный.)источник
time
функция старше эпохи: Unix v1 (в 1971 году) отсчитывается с шагом 1/60 секунды с полуночи 1971/01/01. Это была уже известная ошибка: «Хронологически настроенный пользователь заметит, что 2 ** 32 шестидесятых секунды - это всего лишь около 2,5 лет». Онunsigned
был введен K & R в 1978 году , задолго до того, как была установлена эпоха 1970 года.gmtime
иlocaltime
максимум в году 2147483647 (со следующей секундой после предоставления -2147483648 в качестве года). Таким образом, чтобы преодолеть 55 бит времени, кому-то придется обновить процедуру вывода, чтобы использовать 64-битное int для года вместо беззнакового 32-битного int. Надеюсь, кто-нибудь позаботится об этой ошибке в ближайшие пару миллиардов лет.struct tm
типа есть членtm_year
(представляющий годы с 1900 года), который имеет типint
. 64-разрядные системы могут легко иметь 64-разрядныеtime_t
, но обычно они имеют 32-разрядныеint
. (Если значениеchar
равно 8 битам иint
равно 64 битам, тоshort
может быть 16 или 32 бита, и не будет предопределенного типа для другого размера.) Ноtime()
, вероятно, это единственная функция, для<time.h>
которой действительно требуется поддержка на уровне системы; Вы можете написать свой собственный код для преобразованияtime_t
значений в понятные человеку строки.Он должен поддерживать временные метки и даты до 1 января 1970 года.
источник
time_t
должен быть только 32 битами; это уже 64 бит на многих системах.mktime()
функция возвращает-1
в случае ошибки, поэтому, вероятно, невозможно различить правильные временные метки до 1970-01-01 и ошибку ts. Даты до 1970-01-01 запрещены1969-12-31 23:59:59 UTC
. Отрицательное значение, кроме-1
однозначного.mktime()
вызова для установкиerrno
. (POSIX делает.)