Myślałem o użyciu TIMESTAMP do przechowywania daty + czasu, ale przeczytałem, że jest na nim ograniczenie do roku 2038. Zamiast zadawać moje pytanie zbiorczo, wolałem podzielić je na małe części, tak aby początkujący użytkownicy mogli je łatwo zrozumieć. Więc moje pytanie (a):
- Na czym dokładnie polega problem roku 2038?
- Dlaczego tak się dzieje i co się dzieje, gdy się pojawia?
- Jak to rozwiązujemy?
- Czy są jakieś alternatywne rozwiązania, które nie stwarzają podobnego problemu?
- Co możemy zrobić z istniejącymi aplikacjami, które używają TIMESTAMP, aby uniknąć tak zwanego problemu, kiedy on naprawdę wystąpi?
Z góry dziękuję.
Odpowiedzi:
Oznaczyłem to jako wiki społeczności, więc możesz edytować w wolnym czasie.
Na czym dokładnie polega problem roku 2038?
„Problem z roku 2038 (znany również jako Unix Millennium Bug, Y2K38 przez analogię do problemu Y2K) może spowodować awarię niektórych programów komputerowych przed rokiem 2038 lub w tym roku. Problem dotyczy wszystkich programów i systemów przechowujących czas systemowy jako podpisany 32 -bitowa liczba całkowita i interpretuje tę liczbę jako liczbę sekund od godziny 00:00:00 czasu UTC 1 stycznia 1970 r. "
Dlaczego tak się dzieje i co się dzieje, gdy się pojawia?
Czasy poza godziną 03:14:07 czasu UTC we wtorek, 19 stycznia 2038 r. Będą „zawijać się” i przechowywane wewnętrznie jako liczba ujemna, którą systemy te będą interpretować jako czas z 13 grudnia 1901 r., A nie z 2038 r. Wynika to z fakt, że liczba sekund od epoki UNIX (1 stycznia 1970 00:00:00 GMT) przekroczy maksymalną wartość komputera dla 32-bitowej liczby całkowitej ze znakiem.
Jak to rozwiązujemy?
DATE
typu kolumny. Jeśli potrzebujesz większej dokładności, użyjDATETIME
zamiastTIMESTAMP
. Pamiętaj, żeDATETIME
kolumny nie przechowują informacji o strefie czasowej, więc Twoja aplikacja będzie musiała wiedzieć, która strefa czasowa była używana.Czy są jakieś alternatywne rozwiązania, które nie stwarzają podobnego problemu?
W miarę możliwości staraj się używać dużych typów do przechowywania dat w bazach danych: wystarczy 64-bity - długi typ w GNU C i POSIX / SuS lub
sprintf('%u'...)
w PHP lub rozszerzeniu BCmath.Jakie są potencjalnie psujące przypadki użycia, mimo że nie jesteśmy jeszcze w 2038 roku?
Tak więc MySQL DATETIME ma zakres 1000-9999, ale TIMESTAMP ma tylko zakres 1970-2038. Jeśli Twój system przechowuje daty urodzenia, przyszłe daty przyszłe (np. 30-letnie kredyty hipoteczne) lub podobne, już napotkasz ten błąd. Ponownie, nie używaj TIMESTAMP, jeśli może to stanowić problem.
Co możemy zrobić z istniejącymi aplikacjami, które używają TIMESTAMP, aby uniknąć tak zwanego problemu, kiedy on naprawdę wystąpi?
Niewiele aplikacji PHP będzie nadal dostępnych w 2038 r., Choć trudno to przewidzieć, ponieważ internet nie jest jeszcze starszą platformą.
Oto proces zmieniania kolumny tabeli bazy danych do konwersji
TIMESTAMP
doDATETIME
. Zaczyna się od utworzenia tymczasowej kolumny:Zasoby
źródło
Używając znaczników czasu UNIX do przechowywania dat, w rzeczywistości używasz 32-bitowych liczb całkowitych, które przechowują liczbę sekund od 1970-01-01; zobacz Unix Time
Ta 32-bitowa liczba przepełni się w 2038 roku. Na tym polega problem w 2038 roku.
Aby rozwiązać ten problem, nie możesz używać 32-bitowego znacznika czasu UNIX do przechowywania dat - co oznacza, że podczas korzystania z MySQL nie powinieneś używać
TIMESTAMP
, aleDATETIME
(patrz 10.3.1. Typy DATETIME, DATE i TIMESTAMP ):(Prawdopodobnie) Najlepszą rzeczą jaką możesz zrobić dla aplikacji, aby uniknąć / fix, że problemem jest nie używać
TIMESTAMP
, aleDATETIME
dla kolumn, które muszą zawierać datę, które nie są między 1970 a 2038 r.Jednak jedna mała uwaga: istnieje bardzo duże prawdopodobieństwo (statystycznie rzecz biorąc), że Twoja aplikacja zostanie przepisana kilka razy przed 2038 rokiem ^^ Więc może, jeśli nie będziesz musiał zajmować się datami w przyszłości , nie będziesz musiał zajmować się tym problemem z aktualną wersją Twojej aplikacji ...
źródło
Szybkie wyszukiwanie w Google załatwi sprawę: problem z rokiem 2038
źródło
http://en.wikipedia.org/wiki/Year_2038_problem zawiera większość szczegółów
W podsumowaniu:
1) + 2) Problem polega na tym, że wiele systemów przechowuje informacje o dacie w postaci 32-bitowej liczby int ze znakiem równej liczbie sekund od 1 stycznia 1970 roku. Ostatnią datą, którą można przechowywać w ten sposób, jest 03:14:07 czasu UTC we wtorek 19 stycznia 2038 r. Kiedy to się stanie, int zostanie „zawinięty” i zostanie zapisany jako liczba ujemna, która zostanie zinterpretowana jako data w 1901 roku. Co dokładnie się wtedy stanie, różni się w zależności od systemu, ale wystarczy powiedzieć, że prawdopodobnie nie będzie to dobre dla żadnego z nich!
W przypadku systemów, które przechowują tylko daty z przeszłości, myślę, że nie musisz się martwić przez chwilę! Głównym problemem są systemy, które działają z datami w przyszłości. Jeśli Twój system musi działać z datami za 28 lat w przyszłości, powinieneś zacząć się martwić już teraz!
3) Użyj jednego z alternatywnych dostępnych formatów daty lub przejdź do systemu 64-bitowego i użyj 64-bitowych liczb całkowitych. Lub w przypadku baz danych użyj alternatywnego formatu znacznika czasu (np. Dla MySQL użyj DATETIME)
4) Zobacz 3!
5) Zobacz 4 !!! ;)
źródło
Bracia, jeśli potrzebujesz używać PHP do wyświetlania znaczników czasu, jest to NAJLEPSZE rozwiązanie PHP bez zmiany formatu UNIX_TIMESTAMP.
Użyj funkcji custom_date (). Wewnątrz użyj DateTime. Oto rozwiązanie DateTime .
Tak długo, jak masz UNSIGNED BIGINT (8) jako swoje znaczniki czasu w bazie danych. O ile masz PHP 5.2.0 ++
źródło
Ponieważ nie chciałem niczego aktualizować, poprosiłem mój backend (MSSQL) o wykonanie tej pracy zamiast PHP!
Może nie być skutecznym sposobem, ale działa.
źródło