Метка времени, проблема 2038 года для 64-битной системы Ubuntu

24

Я использую 64-битную систему Ubuntu.

В настоящее время я работаю над проектом, который включает MariaDB. Я планирую внедрить технику меток времени в проекте, чтобы люди получали правильное время для разных часовых поясов.

Я слышал и читал некоторые статьи о проблеме 2038 года для отметки времени. Многие статьи предполагают, что мы используем 64-битную систему, чтобы выиграть «немного» больше времени.

Сколько времени имеет в виду этот «бит»? Достаточно ли долго, чтобы мы могли управлять веб-приложениями до конца? Если это не так, то это как продление на два года, и когда наступит 2040 год, появятся ли у нас приложения, которые не будут работать должным образом?

Tet
источник
27
64-разрядные системы, использующие 64-разрядные time_tцелые числа, дадут вам «немного больше времени» - до 15:30:08 в воскресенье, 4 декабря, 292 277 026 596 человек. Надеюсь, что это достаточно долго для вашего заявления;)
Рон
4
Это не даст вам немного больше. Это дает вам ровно 32 бита.
user12205
5
64-битные временные метки - это еще одна из тех мер временного ограничения. Как насчет людей, работающих над Проектом Утопия в 100 000 000 000 000 CE? Им также понадобятся функциональные компьютерные системы! Использование 128-битных временных меток позволило бы нам однозначно идентифицировать любое время не только из этой итерации вселенной, но и многих, многих других.
Сияющий
1
Поскольку вы никогда ранее не принимали никаких ответов на этом сайте: если вам помог один из приведенных ниже ответов, не забудьте нажать на серый слева от его текста, что означает « Да», этот ответ действителен ! ;-)
Fabby

Ответы:

34

Хорошо, если есть возможность буквально купить «бит», то есть перейти от 32-разрядного целого числа со знаком к 32-разрядному целому числу без знака, все будет работать на 2106.

Переход на 64 бит "несколько лучше". Вы получаете сотни миллиардов лет разрешения.

И Ubuntu делает это:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800

Тем не менее, это уровень ОС. Тот факт, что Ubuntu использует 64-битное целое для своего времени, не означает, что MySQL / MariaDB будет использовать его для хранения своих временных меток. Если для вас важны даты после 2038 года, немедленно начните тестирование.

На самом деле, я могу сэкономить вам время. Это все еще сломано. Об этой ошибке сообщалось более десяти лет назад, но ее основной тест все еще не прошел с 64-битным int.

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

Это даже не хранилище. Это немного жалко.

(И да, это было запущено на MariaDB, версия 10.1)

Оли
источник
8
10 лет назад у них еще есть 22 года, чтобы это исправить. <Скрещивает пальцы> ...
Миндвин
4
NB. Использование 32-разрядных целых чисел без знака - это взлом .
Кевин
6

Не храните это как целое число вообще. Сохраните его как строку даты в формате ISO 8601 . Это стандартный формат, используемый в Интернете.

9999-12-31T23:59:59+00:00
Добей
источник
17
Давайте все поднимем бокал за ошибку 10-го года! ;) Но если серьезно, то строки действительно расширяемы, но они относительно велики (ваш пример - 200 бит!), А анализ и манипулирование примитивными числами - в миллиарды раз быстрее. Это важно
Оли
6
Это отличный формат для отображения - и только для этого. Для всего остального (то есть для обработки данных до последнего момента, когда вы решите отформатировать их для пользователя), таких как сравнение, выполнение арифметики и т. Д., Метка времени Unix как целое число (или число с плавающей запятой) намного лучше.
egmont
1
@ Оли Это имеет значение, если это действительно имеет значение. Это решение не терпит неудачу, когда есть времена, старше эпохи UNIX. Формат - это стандарт, используемый для дат по всему Интернету, в протоколах и API. Если вы храните что-то в столбце MariaDB, то действительно, это то, как вы должны хранить это на диске. Конечно, в памяти, может быть, вы хотите сохранить его в более удобной структуре данных. И вам не нужны последние 40 бит, если вы всегда используете UTC.
Доби