Znaczniki czasu Unix bez bólu głowy
Zapytaj trzech programistów, która jest godzina, a możesz otrzymać trzy odpowiedzi, w zależności od tego, gdzie siedzą. Zapytaj znacznik czasu Unix i otrzymasz dokładnie jedną liczbę, tę samą dla wszystkich na świecie. Ta pojedyncza liczba całkowita to powód, dla którego czas epoki po cichu leży u podstaw niemal każdego pliku logów, wiersza bazy danych i odpowiedzi API, z jaką kiedykolwiek się zetkniesz. Ta strona wyjaśnia, co ta liczba oznacza, jak ją odczytywać w obu kierunkach i gdzie zwykle wpędza ludzi w tarapaty.

Czym właściwie jest czas Unix
Znacznik czasu Unix to liczba sekund, które upłynęły od 00:00:00 UTC 1 stycznia 1970 roku, nie licząc sekund przestępnych. Ten moment nazywany jest epoką i wczesni inżynierowie Unix wybrali go po prostu dlatego, że była to wygodna okrągła data, od której można liczyć. W chwili epoki wartość wynosi dokładnie 0. Każda kolejna sekunda dodaje jeden, więc liczba tylko rośnie. Daty przed 1970 rokiem są jak najbardziej prawidłowe i są wyrażane jako ujemne liczby całkowite.
Pojęcie to można też spotkać pod nazwą czasu POSIX lub, potocznie, czasu epoki. Niezależnie od etykiety mechanika jest ta sama: jeden ciągle rosnący licznik sekund. Ponieważ jest to zwykła liczba całkowita, a nie sformatowany ciąg znaków, komputer może przechować go w kilku bajtach i porównać dwie takie wartości jednym odejmowaniem.
Sekundy, milisekundy i inne
Klasyczny czas Unix liczy całe sekundy, co daje dziesięciocyfrową liczbę, którą widzimy dzisiaj. Wiele środowisk potrzebuje jednak większej rozdzielczości. JavaScript na przykład pracuje w milisekundach, produkując trzynastocyfrową wartość, a niektóre systemy idą jeszcze dalej w mikrosekundy lub nanosekundy. Prosta reguła: dziesięciocyfrowa liczba to sekundy, trzynaście cyfr to milisekundy. Jeśli po konwersji data ląduje gdzieś około 1970 roku, a oczekiwałeś dnia dzisiejszego, niemal na pewno podałeś milisekundy do pola sekund lub odwrotnie. Nasz konwerter automatycznie wykrywa rząd wielkości, więc rzadko musisz to zgadywać.
Dlaczego programiści na nim polegają
Główną zaletą jest to, że znacznik czasu jest neutralny pod względem strefy czasowej. Liczba całkowita 1735689600 odnosi się do tej samej chwili w Tokio, Berlinie i Sao Paulo. Przechowywanie tej liczby zamiast sformatowanego lokalnego ciągu znaków oznacza, że nigdy nie musisz zastanawiać się, do którego zegara należała wartość. Sortowanie jest trywialne, bo porządek chronologiczny to po prostu porządek numeryczny, więc indeks bazodanowy na kolumnie z znacznikami czasu sortuje zdarzenia poprawnie bez żadnego parsowania. Arytmetyka jest równie czysta: różnica między dwoma zdarzeniami to jedno odejmowanie, a dodanie doby to dodanie 86400. Te właściwości to dokładnie powód, dla którego logi, tokeny, pamięci podręczne i kolejki komunikatów sięgają po czas epoki.
Konwersja w obu kierunkach
Przejście od znacznika czasu do daty czytelnej dla człowieka oznacza wzięcie liczby sekund i rzutowanie jej na kalendarz, a następnie sformatowanie w wybranej strefie czasowej. W drugą stronę bierzesz rok, miesiąc, dzień i godzinę, decydujesz, w jakiej strefie są wyrażone, i zwijasz z powrotem do sekund od epoki. Nasze narzędzie wykonuje oba kierunki natychmiast i w całości w przeglądarce, więc nic, co wkleisz, nie opuszcza Twojego urządzenia. Wklej liczbę, by ją zdekodować, lub wybierz datę, by ją zakodować, i odczytaj wynik zarówno w UTC, jak i w czasie lokalnym w tej samej chwili.

UTC a czas lokalny, klasyczna pułapka
Sam znacznik czasu nie ma strefy czasowej; jest zawsze zakotwiczony do UTC. Zamieszanie pojawia się dopiero przy jego wyświetlaniu. Jeśli skonwertujesz 1700000000 i Twój ekran pokazuje godzinę wieczorną, podczas gdy kolega w innym kraju widzi popołudniową, nic nie jest zepsute — oboje patrzycie na tę samą chwilę wyrenderowaną w różnych zegarach lokalnych. Błędy wkradają się, gdy kod odczytuje lokalną datę tak, jakby była UTC, lub rejestruje czas zegarowy bez zapisania przesunięcia. Bezpieczny nawyk to przechowywać i przesyłać UTC, a przesunięcie lokalne stosować dopiero w ostatniej chwili, gdy pokazujesz wartość człowiekowi. W razie wątpliwości porównaj z wierszem UTC w konwerterze, a nie z lokalnym.
Problem roku 2038
Wiele starszych systemów przechowywało czas Unix w 32-bitowej liczbie całkowitej ze znakiem. To pole kończy się jedną sekundę po 03:14:07 UTC 19 stycznia 2038 roku, gdy licznik przepełnia się i zawija do ujemnej wartości, potencjalnie cofając daty do 1901 roku. To ta sama rodzina problemu co Y2K. Dobra wiadomość jest taka, że nowoczesne systemy operacyjne i języki w dużej mierze przeszły na 64-bitowe znaczniki czasu, które nie przepełnią się przez mniej więcej 292 miliardy lat, więc dla nowego kodu jest to głównie historyczna ciekawostka warta poznania, a nie nagły wypadek.
Po więcej pomocników działających w przeglądarce zajrzyj do naszych narzędzi deweloperskich, a jeśli potrzebujesz pracować z samymi liczbami, kalkulatory są o jedno kliknięcie stąd.
Najczęściej zadawane pytania
Czym jest znacznik czasu Unix?
To liczba sekund od 00:00:00 UTC 1 stycznia 1970 roku, nie licząc sekund przestępnych. Ten punkt startowy nazywa się epoką, a licznik tylko rośnie w czasie.
Dlaczego moja liczba konwertuje się na datę bliską 1970 roku?
Prawdopodobnie pomyliłeś sekundy i milisekundy. Dziesięciocyfrowa liczba to sekundy, a trzynastocyfrowa to milisekundy. Podanie milisekund do pola sekund dzieli pozorny czas przez około tysiąc, lądując blisko epoki.
Czy znacznik czasu Unix ma strefę czasową?
Nie. Wartość jest zawsze zakotwiczona do UTC. Strefa czasowa pojawia się dopiero przy wyświetlaniu znacznika jako daty czytelnej dla człowieka, dlatego ta sama liczba może pokazywać różne godziny zegarowe różnym osobom.
Jak przekonwertować datę z powrotem na znacznik czasu?
Podaj rok, miesiąc, dzień i godzinę, zdecyduj, w jakiej strefie ta data jest wyrażona, a narzędzie zwinie ją do sekund od epoki. Oba kierunki możesz wykonać na tej stronie natychmiast w przeglądarce.
Czym jest problem roku 2038?
Systemy przechowujące czas Unix w 32-bitowej liczbie całkowitej ze znakiem przepełniają się jedną sekundę po 03:14:07 UTC 19 stycznia 2038 roku. Nowoczesne 64-bitowe znaczniki czasu unikają tego przez miliardy lat, więc większość aktualnego oprogramowania nie jest zagrożona.
Czy moje dane są wysyłane na serwer?
Nie. Konwersja odbywa się w całości w przeglądarce, więc wszelkie wklejone znaczniki czasu lub daty pozostają na Twoim urządzeniu.
