Prawie każdy system, z którego korzystasz, zapisuje czas jako liczbę. Ta liczba nazywa się znacznikiem czasu Unix (ang. Unix timestamp) i oznacza liczbę sekund, które upłynęły od 1 stycznia 1970 roku, od godziny 00:00:00 UTC. W tym tekście wyjaśniamy, skąd wzięła się ta konwencja, jak działa i dlaczego w 2038 roku część starszych systemów może mieć kłopot.
Czym jest czas Unix?
Czas Unix to licznik sekund od ustalonego momentu zwanego epoką (ang. epoch). Epoką jest północ czasu uniwersalnego z 31 grudnia 1969 na 1 stycznia 1970. Przykładowo 22 października 2026 roku o godzinie 10:00 czasu polskiego letniego (czyli 08:00 UTC) timestamp wynosi 1792656000. Warto zauważyć, że nie zawiera on żadnej informacji o strefie czasowej: opisuje jednoznaczny moment w czasie, a zamianą na lokalną godzinę zajmuje się dopiero program, który go wyświetla. Jak powstaje UTC, wyjaśniamy w artykule Czas GPS, UTC i TAI.
Dlaczego akurat rok 1970?
System Unix powstawał na początku lat siedemdziesiątych w Bell Labs. Twórcy potrzebowali prostego, niedawnego punktu odniesienia, dlatego wybrano początek dekady, w której pracowali. Początkowo licznik liczył jednostki o innej długości i miał inną epokę, ale z czasem ustabilizowano go na sekundach od 1 stycznia 1970. Konwencja przyjęła się na tyle, że dziś używają jej systemy Linux, macOS, Android, a także języki programowania i bazy danych.
Zalety takiego zapisu
- Jedna liczba zamiast skomplikowanej daty. Łatwo porównywać, sortować i odejmować momenty.
- Niezależność od stref czasowych. Moment jest taki sam na całym świecie.
- Prostota przy obliczeniach. Odstęp między zdarzeniami to zwykłe odejmowanie sekund.
| Moment | Timestamp (s) |
|---|---|
| 1 stycznia 1970, 00:00:00 UTC | 0 |
| 1 stycznia 2000, 00:00:00 UTC | 946684800 |
| 22 października 2026, 08:00:00 UTC | 1792656000 |
| 19 stycznia 2038, 03:14:07 UTC | 2147483647 |
Sekundy przestępne a czas Unix
Czas Unix traktuje każdą dobę jako dokładnie 86 400 sekund. Dlatego nie liczy sekund przestępnych: w dniu, w którym dodano taką sekundę, systemy musiały ją „ukryć” (powtórzyć jedną sekundę albo rozmyć jej dodanie w czasie). To ważny szczegół dla programistów, bo zwykła różnica timestampów może nie oddawać dokładnej liczby sekund SI między zdarzeniami. Historię sekund przestępnych i planów ich wycofania opisujemy w tekście Sekunda przestępna odchodzi do historii.
Problem roku 2038
Wiele starszych programów zapisuje timestamp jako 32-bitową liczbę całkowitą ze znakiem. Największa wartość, jaką taka liczba może przyjąć, to 2 147 483 647, czyli 231 − 1. Ten moment przypada na 19 stycznia 2038 roku, godz. 03:14:07 UTC. Sekundę później licznik przekroczy zakres i w wielu implementacjach „przewinie się” do wartości ujemnej, interpretowanej jako 13 grudnia 1901 roku. Zjawisko nazywa się problemem roku 2038 albo „Y2K38”.
Dotyczy to głównie oprogramowania i urządzeń, które wciąż korzystają z 32-bitowych typów czasu: starszych systemów wbudowanych, niektórych formatów plików i protokołów, sterowników czy firmware’u. Współczesne systemy 64-bitowe używają 64-bitowego timestampu, który wystarczy na około 292 miliardy lat, więc w nich nie ma problemu.
Jak sprawdzić, czy to Cię dotyczy?
- Zidentyfikuj systemy i urządzenia, które mają działać po 2038 roku (kasy, sterowniki, liczniki, czujniki, sprzęt przemysłowy).
- Sprawdź, jaki typ danych czasu stosują. W kodzie szukaj 32-bitowych typów (np.
intlubtime_tw starszych kompilacjach). - Sprawdź daty w przyszłości: kalendarze, umowy z terminem po 2038, daty wygaśnięcia certyfikatów lub licencji zapisane jako timestamp.
- Zaplanuj aktualizację oprogramowania lub wymianę sprzętu.
Warto pamiętać, że problem nie zaczyna się w 2038 roku. Dotyka każdego programu, który wcześniej oblicza daty z przyszłości, na przykład okresy ważności na 15 lat.
Timestamp w pigułce: przydatne wzory
- Od timestampu do czasu lokalnego: dodaj przesunięcie strefy (np. +3600 s dla CET i +7200 s dla CEST).
- Liczba dni od 1970: timestamp / 86400, zaokrąglona w dół.
- Różnica czasu między dwoma zdarzeniami: zwykłe odejmowanie timestampów, wynik w sekundach.
- Milisekundy: JavaScript i wiele API używa timestampów w milisekundach, czyli liczby 1000 razy większej.
Jeśli chcesz zobaczyć, jak komputer porównuje swój zegar z wzorcem, zajrzyj do artykułu Czym jest NTP. A jeśli wystarczy Ci obliczyć odstęp między dwiema godzinami w zwykłym zapisie, użyj kalkulatora odstępu czasowego. Serwis ma charakter informacyjny i nieoficjalny.
Dlaczego programiści wolą UTC?
Zapisywanie zdarzeń w UTC i przeliczanie na czas lokalny dopiero przy wyświetlaniu to jedna z najstarszych dobrych praktyk w informatyce. Zapis lokalny ma pułapki: godzina może wystąpić dwa razy (jesienią) albo nie wystąpić wcale (wiosną), a reguły stref zmieniają się z roku na rok. Timestamp jest od tych problemów wolny. Szczegóły dotyczące stref IANA i ich aktualizacji opisaliśmy m.in. w artykule o przygotowaniu do zmiany czasu.
Gdzie spotkasz timestampy na co dzień?
- w nagłówkach plików i systemach plików (data modyfikacji),
- w tokenach logowania i certyfikatach (czas ważności),
- w dziennikach serwerów i bazach danych,
- w aplikacjach, które pokazują „x minut temu”.
Jak zamienić timestamp na datę bez programu?
- Podziel liczbę przez 86 400, aby dostać liczbę pełnych dób od 1 stycznia 1970.
- Reszta z dzielenia to sekundy, które upłynęły od północy UTC danego dnia; podziel ją przez 3600, żeby uzyskać godziny, i resztę przez 60 na minuty.
- Dodaj 1 lub 2 godziny, jeśli chcesz godzinę w Polsce (zimą i latem odpowiednio).
Dla przykładu timestamp 1792656000 daje po podzieleniu przez 86 400 liczbę 20 748 dób od epoki i resztę równą 28 800 sekund, czyli dokładnie 8 godzin, co odpowiada 08:00 UTC. Jeśli nie chcesz liczyć ręcznie, odstęp między dwoma godzinami możesz sprawdzić w kalkulatorze odstępu czasowego, a godzinę w innym mieście w przeliczniku różnicy czasu.