Тимчасова мітка, проблема 2038 року для 64-бітної системи Ubuntu


24

Я використовую 64-бітну систему Ubuntu.

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

Я чув і читав деякі статті про проблему 2038 року для часової позначки. Багато статей пропонують використовувати 64-бітну систему, щоб придбати більше часу.

На скільки часу посилається цей "біт"? Чи достатньо довго, щоб ми могли керувати веб-додатками до кінця? Якщо це не так, то це як продовження лише на два роки, тож коли прийде 2040 рік, у нас з’являться програми, які не працюють належним чином?


27
64-бітні системи, що використовують 64-бітні time_tцілі числа, дадуть вам "трохи" більше часу - до 15:30:08 в неділю, 4 грудня, 292,277,026,596. Сподіваюсь, це досить довго для вашої заявки;)
Рон,

4
Це не дає вам "трохи" більше. Це дає вам рівно на 32 біти більше.
користувач12205

5
64-розрядні часові позначки - ще один із цих заходів зупинки. Що з людьми, які працюють над Project Utopia в 100 000 000 000 000 CE? Їм також знадобляться функціональні комп'ютерні системи! Використання 128-бітних часових позначок дозволило б нам однозначно ідентифікувати будь-який час не лише цієї ітерації Всесвіту, але й багатьох, багатьох інших.
Blacklight Shining

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-бітовим інтертом.

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

Це навіть не сховище. Це трохи жалюгідно.

(І так, це було запущено на MariaDB, версія 10.1)


8
10 років минулого, у них ще 22 роки, щоб виправити це. <
Перехрести

4
Примітка: Використання 32-бітових цілих чисел - це хакер .
Кевін

6

Не зберігайте це як ціле число. Зберігайте його як відформатований рядок дати ISO 8601 . Це стандартний формат, який використовується в Інтернеті.

9999-12-31T23:59:59+00:00

17
Давайте всі піднімемо склянку на помилку Year10K! ;) Якщо серйозно, хоча рядки справді розширюються, вони відносно величезні (ваш приклад - 200 біт!), А розбір та маніпулювання примітивними числами в мільйон разів швидше. Це має значення.
Олі

6
Це чудовий формат для показу - і лише для цього. Для всього іншого (тобто, обробляти дані до останнього моменту, коли ви вирішите їх відформатувати користувачеві), як, наприклад, порівняння, виконання арифметики тощо. Часова мітка Unix як ціле число (або плаваюче) набагато краще.
Егмонт

1
@ Oli Це важливо, якщо це насправді має значення. Це рішення не виходить з ладу, коли в епоху UNIX є старіші. Формат - це стандарт, який використовується для дат по всьому Інтернету, у протоколах та API. Якщо ви зберігаєте щось у стовпчику MariaDB, то насправді, саме так слід зберігати його на диску. Впевнені, що в пам'яті, можливо, ви хочете зберегти її в більш прихильну структуру даних. І вам не потрібно останніх 40 біт, якщо ви завжди використовуєте UTC.
dobey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.