Sygnatura czasowa, problem z roku 2038 dla 64-bitowego systemu Ubuntu

24

Używam 64-bitowego systemu Ubuntu.

Obecnie pracuję nad projektem, który obejmuje MariaDB. Planuję wprowadzić technikę znaczników czasu do projektu, aby ludzie otrzymali właściwy czas dla innej strefy czasowej.

Słyszałem i czytałem artykuły o problemie z datą 2038 roku. Wiele artykułów sugeruje, że używamy 64-bitowego systemu, aby kupić „nieco” więcej czasu.

Ile czasu dotyczy ten „bit”? Czy to wystarczy, abyśmy mogli zarządzać aplikacjami internetowymi do końca? Jeśli tak nie jest, to czy to tylko przedłużenie o dwa lata, więc kiedy nadejdzie rok 2040, czy będziemy mieli aplikacje, które nie będą działały odpowiednio?

tet
źródło
27
Systemy 64-bitowe wykorzystujące 64-bitowe time_tliczby całkowite dadzą ci „nieco” więcej czasu - do 15:30:08 w niedzielę, 4 grudnia 292 277 026,596. Mam nadzieję, że to wystarczy na twoją aplikację;)
Ron
4
To nie daje ci „trochę” więcej. Daje ci dokładnie 32 bity więcej.
user12205,
5
64-bitowe znaczniki czasu to kolejna z tych miar zatrzymania. Co z ludźmi pracującymi nad projektem Utopia w 100 000 000 000 000 CE? Będą też potrzebować funkcjonalnych systemów komputerowych! Używanie 128-bitowych znaczników czasu pozwoliłoby nam jednoznacznie zidentyfikować czas na podstawie nie tylko iteracji wszechświata, ale także wielu, wielu innych.
Blacklight Shining
1
Ponieważ nigdy wcześniej nie akceptowałeś żadnych odpowiedzi na tej stronie: Jeśli jedna z poniższych odpowiedzi pomogła Ci, nie zapomnij kliknąć szarego po lewej stronie jej tekstu, co oznacza Tak, ta odpowiedź jest poprawna ! ;-)
Fabby

Odpowiedzi:

34

Cóż, jeśli istnieje opcja dosłownego kupienia „bitu”, tj. Przeniesienia z 32-bitowej liczby całkowitej ze znakiem na 32-bitową liczbę całkowitą bez znaku, wszystko działa nadal w 2106.

Przesyłanie do wersji 64-bitowej jest „nieco lepsze”. Rozdzielczość wynosi setki miliardów lat.

Ubuntu robi to:

$ uname -p
x86_64

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

Jest to jednak poziom systemu operacyjnego. To, że Ubuntu używa w swoich czasach 64-bitowej liczby całkowitej, nie oznacza, że ​​MySQL / MariaDB użyje go do przechowywania znaczników czasu. Jeśli daty po 2038 r. Są dla Ciebie ważne, rozpocznij testy natychmiast.

Właściwie mogę ci zaoszczędzić trochę czasu. Nadal jest zepsuty. Ten błąd został zgłoszony ponad dekadę temu, ale jego główny test nadal kończy się niepowodzeniem z 64-bitową int.

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

To nawet nie jest pamięć. To jest trochę żałosne.

(I tak, to było uruchomione na MariaDB, wersja 10.1)

Oli
źródło
8
10 lat temu wciąż mają 22 lata na naprawę. <Krzyżuje palce> ...
Mindwin
4
NB: Używanie 32-bitowych liczb całkowitych bez znaku to włamanie .
Kevin
6

W ogóle nie przechowuj go jako liczby całkowitej. Zapisz go jako ciąg daty sformatowany zgodnie z ISO 8601 . Jest to standardowy format używany w Internecie.

9999-12-31T23:59:59+00:00
dobey
źródło
17
Podnieśmy szklankę do błędu Year10K! ;) Ale poważnie, podczas gdy ciągi są naprawdę rozszerzalne, są one stosunkowo duże (twój przykład to 200 bitów!), A parsowanie i manipulowanie liczbami pierwotnymi jest bazillion razy szybsze. To się liczy.
Oli
6
To świetny format do wyświetlania - i tylko do tego. Jeśli chodzi o cokolwiek innego (tj. Obsługę danych do ostatniej chwili, kiedy zdecydujesz się sformatować je dla użytkownika), np. Porównywanie, wykonywanie arytmetyki itp., Znacznik czasu Unix jako liczba całkowita (lub liczba zmiennoprzecinkowa) jest znacznie lepszy.
egmont
1
@Oli To ma znaczenie, jeśli to naprawdę ma znaczenie. To rozwiązanie nie zawodzi, gdy są czasy starsze niż epoka UNIX. Format jest standardem stosowanym dla dat w całym Internecie, w protokołach i interfejsach API. Jeśli przechowujesz coś w kolumnie MariaDB, to tak naprawdę powinieneś przechowywać to na dysku. Pewnie, w pamięci, może chcesz zapisać to w łatwiejszej strukturze danych. I nie potrzebujesz ostatnich 40 bitów, jeśli zawsze używasz UTC.
dobey,