Я думал об использовании TIMESTAMP для хранения даты и времени, но прочитал, что на него есть ограничение до 2038 года. Вместо того, чтобы задавать вопрос сразу, я предпочел разбить его на мелкие части, чтобы новичкам было легко понять. Итак, мой вопрос (ы):
- В чем именно проблема 2038 года?
- Почему это происходит и что происходит, когда это происходит?
- Как решить эту проблему?
- Есть ли альтернативы его использованию, которые не создают аналогичной проблемы?
- Что мы можем сделать с существующими приложениями, использующими TIMESTAMP, чтобы избежать так называемой проблемы, когда она действительно возникает?
Заранее спасибо.
Ответы:
Я пометил это как вики сообщества, так что не стесняйтесь редактировать на досуге.
В чем именно проблема 2038 года?
"Проблема 2038 года (также известная как ошибка тысячелетия Unix, 2000 год по аналогии с проблемой 2000 года) может привести к сбою некоторого компьютерного программного обеспечения до или в 2038 году. Проблема затрагивает все программное обеспечение и системы, которые хранят системное время в виде подписанного 32 -битовое целое число и интерпретировать это число как количество секунд с 00:00:00 UTC 1 января 1970 г. "
Почему это происходит и что происходит, когда это происходит?
Время после 03:14:07 UTC во вторник, 19 января 2038 г., будет «циклически» и сохранено внутри как отрицательное число, которое эти системы будут интерпретировать как время 13 декабря 1901 г., а не 2038 г. Это связано с тем, что тот факт, что количество секунд с эпохи UNIX (1 января 1970 00:00:00 по Гринвичу) превысит максимальное значение компьютера для 32-битного целого числа со знаком.
Как решить эту проблему?
DATE
типа столбца. Если вам нужна более высокая точность, используйтеDATETIME
вместоTIMESTAMP
. Помните, чтоDATETIME
столбцы не хранят информацию о часовом поясе, поэтому ваше приложение должно будет знать, какой часовой пояс использовался.Есть ли альтернативы его использованию, которые не создают аналогичной проблемы?
По возможности старайтесь использовать большие типы для хранения дат в базах данных: достаточно 64-битных - длинный длинный тип в GNU C и POSIX / SuS, или
sprintf('%u'...)
в PHP или в расширении BCmath.Какие варианты использования потенциально ломают, хотя мы еще не в 2038 году?
Таким образом, MySQL DATETIME имеет диапазон 1000-9999, но TIMESTAMP имеет диапазон только 1970-2038. Если ваша система хранит даты рождения, будущие даты вперед (например, 30-летнюю ипотеку) или что-то подобное, вы уже столкнетесь с этой ошибкой. Опять же, не используйте TIMESTAMP, если это будет проблемой.
Что мы можем сделать с существующими приложениями, использующими TIMESTAMP, чтобы избежать так называемой проблемы, когда она действительно возникает?
В 2038 году будет мало приложений PHP, хотя это трудно предвидеть, поскольку Интернет еще не является устаревшей платформой.
Вот процесс изменения столбца таблицы базы данных для преобразования
TIMESTAMP
вDATETIME
. Все начинается с создания временного столбца:Ресурсы
источник
При использовании временных меток UNIX для хранения дат вы фактически используете 32-битные целые числа, которые подсчитывают количество секунд с 1970-01-01; см. Unix Time
Это 32-битное число переполнится в 2038 году. Это проблема 2038 года.
Чтобы решить эту проблему, вы не должны использовать 32-битную временную метку UNIX для хранения ваших дат - это означает, что при использовании MySQL вы не должны использовать
TIMESTAMP
, ноDATETIME
(см. 10.3.1. Типы DATETIME, DATE и TIMESTAMP ):(Вероятно) лучшее , что вы можете сделать для вашего приложения , чтобы избежать / исправить эту проблему, чтобы не использовать
TIMESTAMP
, ноDATETIME
для столбцов , которые должны содержать даты, которые не являются в период между 1970 и 2038 гг .Однако одно небольшое замечание: очень высока вероятность (с точки зрения статистики), что ваше приложение будет несколько раз переписано до 2038 года ^^ Так что, возможно, если вам не придется иметь дело с датами в будущем , вам не придется решать эту проблему с текущей версией вашего приложения ...
источник
Быстрый поиск в Google поможет: проблема 2038 года
источник
http://en.wikipedia.org/wiki/Year_2038_problem содержит большую часть деталей.
В итоге:
1) + 2) Проблема в том, что многие системы хранят информацию о дате как 32-битное целое число со знаком, равное количеству секунд с 01.01.1970. Самая последняя дата, которая может быть сохранена, как это, - 03:14:07 UTC во вторник, 19 января 2038 года. Когда это произойдет, int будет "зацикливаться" и сохраняться как отрицательное число, которое будет интерпретироваться как дата в 1901 году. Что именно тогда произойдет, варьируется от системы к системе, но достаточно сказать, что это, вероятно, не будет хорошо ни для одной из них!
Для систем, которые хранят только даты в прошлом, я думаю, вам не нужно беспокоиться некоторое время! Основная проблема связана с системами, которые работают с датами в будущем. Если ваша система должна работать с датами на 28 лет вперед, вам следует начать беспокоиться прямо сейчас!
3) Используйте один из доступных альтернативных форматов даты или перейдите на 64-битную систему и используйте 64-битные целые числа. Или для баз данных используйте альтернативный формат отметки времени (например, для MySQL используйте DATETIME)
4) Смотрите 3!
5) См. 4 !!! ;)
источник
Братья, если вам нужно использовать PHP для отображения временных меток, это ЛУЧШЕЕ решение PHP без изменения формата UNIX_TIMESTAMP.
Используйте функцию custom_date (). Внутри него используйте DateTime. Вот решение DateTime .
Пока у вас есть UNSIGNED BIGINT (8) в качестве меток времени в базе данных. Если у вас PHP 5.2.0 ++
источник
Поскольку я не хотел ничего обновлять, я попросил свой сервер (MSSQL) выполнить эту работу вместо PHP!
Возможно, это не эффективный способ, но он работает.
источник