2014-02-10 2 views
-2

Я видел это много раз, например. на UNIX, в MySQL timestamp и т.д .: Эпоха начинается в 1970-1-1, но максимальный записываемый год 2038. Теперь позвольте мне рассчитывать:Почему мы не используем полные 32 бита для хранения 136 лет с Эпохи?

2^32/60/60/24/365+1970 
2106 

Таким образом, если мы использовали полные 32 бита, то мы, естественно, получить до 2106 года без каких-либо проблем. Но, по-видимому, 2038 год соответствует только 31 бит. Так почему мы выбрасываем один бит? Используя полные 32 бита, мы могли бы надеяться, что нам не придется решать проблему, так как мы, вероятно, сначала уничтожим Землю ...

Реакция на комментарии: конечно, это потому, что она подписана, но зачем нужна метка времени должны быть подписаны? Вот в чем вопрос.

+1

-1 используется для указания ошибки, поэтому я предполагаю, что это должно быть подписано, и дать время до 1970 года – dalle

+5

Знаковый бит позволяет отрицательные даты, т.е. даты до 1970 года –

+0

@MikeW не MySQL, по крайней мере. Вы не можете представлять даты до 1970 года в метку времени. – TMS

ответ

4

Это может показаться сумасшедшим, но люди могут захотеть представить даты до 1970 года. Переключение интерпретации классического значения time_t не вызовет ничего, кроме неприятностей.

Проблема 2038 может быть устранена путем переключения на 64-разрядное представление с той же спецификацией. Именно то, как это должно быть сделано, подлежит обсуждению, поскольку возможность представлять даты в миллиарды лет в будущем имеет сомнительную ценность, когда эта точность может использоваться для представления второстепенных времен, но наивное решение работает лучше, чем ничего.

Короткий ответ: мы используем знаковое значение, потому что это стандарт.

+1

.. .and с особым учетом mysql, 'DATETIME' является альтернативой' TIMESTAMP', который обрабатывает гораздо более длительный таймфрейм. – admdrew

+1

Представляя даты со временем, рекомендуется использовать только DATETIME. Значения 'TIMESTAMP' ограничены диапазоном' time_t' и имеют ограничение 2038, поэтому я настоятельно рекомендую использовать их. Это не отдаленное, абстрактное будущее, это всего лишь 24 года. – tadman

+0

Согласовано. Я должен был прочитать в документах mysql, чтобы понять, почему кто-то * использовал бы 'TIMESTAMP' в наши дни. – admdrew

2

Это, вероятно, подпадает под «почему time_t подписан и не без знака» в этом случае вы можете быть заинтересованы услышать причину этого здесь:

Был первоначально некоторые споры о том, следует ли time_t Unix быть подписан или без знака. Если unsigned, его диапазон в будущем будет удвоен, откладывает 32-битное переполнение (на 68 лет). Тем не менее, это было бы , неспособное представлять времена до 1970 года. Деннис Ритчи, когда его спросили о , этот вопрос, сказал, что он не думал очень глубоко об этом, но был из мнений о том, что способность представлять все времена в течение его жизни было бы приятным. (Рождение Ричи, в 1941 году, около Unix-времени 93 400 000.) Консенсус заключается в том, что время будет подписано, и это обычная практика. Платформа для разработки программного обеспечения для версии 6 операционной системы QNX имеет 324-разрядный бит-бит , но более старые версии используют тип подписанного типа.

+1

Вы цитируете какой-либо конкретный ресурс? Если да, укажите ссылку на него. – TMS