Czym jest znacznik czasu Unix (i dlaczego programiści go używają)?
Znacznik czasu Unix to pojedyncza liczba całkowita: liczba sekund, które upłynęły od 1 stycznia 1970 roku, godzina 00:00:00 UTC. Ten moment nazywany jest epoką Unix, a każda sekunda od tamtej pory jest liczona bez przerwy.
Aktualny znacznik czasu wynosi gdzieś około 1 750 000 000. Ta liczba sama w sobie mówi każdemu komputerowi, bazie danych lub API dokładnie, który moment w czasie masz na myśli — bez żadnej niejednoznaczności.
Dlaczego 1970?
Unix został opracowany pod koniec lat 60. w Bell Labs. Kiedy inżynierowie potrzebowali stałego punktu odniesienia dla czasu, wybrali 1 stycznia 1970 roku — początek nowej dekady, łatwy do zrozumienia, i wygodnie w niedawnej przeszłości, tak że przechowywane daty nie wymagałyby liczb ujemnych dla niczego praktycznego w tamtym czasie.
Był to pragmatyczny wybór, a nie zasadniczy. I się przyjął.
Problem, który rozwiązują znaczniki czasu Unix
Reprezentowanie dat jako czytelnych dla człowieka ciągów znaków tworzy niejednoznaczność na każdej warstwie:
- Niezgodność formatu: Czy
03/04/25to 4 marca czy 3 kwietnia? Czy to 1925 czy 2025? - Zamieszanie ze strefami czasowymi: „Piątek godzina 15:00" oznacza inny moment w Londynie niż w Tokio
- Różnice lokalne: Niektóre kraje piszą dzień-miesiąc-rok, inne miesiąc-dzień-rok
Znacznik czasu Unix omija to wszystko. 1711929600 to jeden, jednoznaczny moment w czasie, niezależnie od tego, gdzie jesteś lub jaki format preferujesz. Maszyny się zgadzają; ludzie mogą przeliczać.
Sekundy, milisekundy i mikrosekundy
Oryginalny znacznik czasu Unix jest w sekundach. Jednak różne systemy używają różnych rozdzielczości:
| Format | Jednostka | Przykład |
|---|---|---|
| Unix (POSIX) | Sekundy | 1711929600 |
JavaScript Date.now() | Milisekundy | 1711929600000 |
Python time.time() | Sekundy (zmiennoprzecinkowe) | 1711929600.123 |
| Znaczniki czasu bazy danych | Często mikrosekundy | 1711929600000000 |
Jest to jedno z najczęstszych źródeł błędów podczas pracy w różnych systemach. Znacznik czasu JavaScript przekazany bezpośrednio do funkcji Python lub Go będzie 1000 razy za duży. Zawsze sprawdzaj rozdzielczość przy przekraczaniu granic systemów.
Odczytywanie i zapisywanie znaczników czasu Unix
W JavaScript / TypeScript
// Aktualny znacznik czasu w sekundach
Math.floor(Date.now() / 1000)
// Aktualny znacznik czasu w milisekundach
Date.now()
// Konwersja znacznika czasu (sekundy) na obiekt Date
new Date(timestamp * 1000)
// Konwersja Date na znacznik czasu (sekundy)
Math.floor(new Date('2024-04-01').getTime() / 1000)
W Python
import time, datetime
# Aktualny znacznik czasu (zmiennoprzecinkowy)
time.time()
# Konwersja na datetime
datetime.datetime.fromtimestamp(1711929600)
# Konwersja datetime na znacznik czasu
datetime.datetime(2024, 4, 1).timestamp()
W SQL (PostgreSQL)
-- Aktualny znacznik czasu
EXTRACT(EPOCH FROM NOW())::int
-- Konwersja na znacznik czasu
TO_TIMESTAMP(1711929600)
Strefy czasowe nie wpływają na sam znacznik czasu
To jest ważne i często źle rozumiane.
Znacznik czasu Unix zawsze reprezentuje moment w UTC. Kiedy go wyświetlasz, konwertujesz na lokalną strefę czasową. Kiedy go przechowujesz, przechowujesz wartość UTC. Sam znacznik czasu jest neutralny względem strefy czasowej.
Oznacza to:
- Dwaj użytkownicy w różnych strefach czasowych przechowujący „teraz" otrzymają ten sam znacznik czasu
- Podczas wyświetlania każdy użytkownik widzi go w swojej lokalnej strefie czasowej
- Żadnych korekt przesunięcia w bazie danych — tylko w warstwie prezentacji
Problem roku 2038
Znaczniki czasu Unix przechowywane jako 32-bitowa liczba całkowita ze znakiem mogą liczyć tylko do 2 147 483 647 sekund — co odpowiada 19 stycznia 2038 roku, godzina 03:14:07 UTC. Po tym czasie 32-bitowy licznik przekroczy zakres do dużej liczby ujemnej.
Systemy, które nadal przechowują znaczniki czasu jako 32-bitowe liczby całkowite, przestaną działać w tym dniu. Większość nowoczesnych systemów używa 64-bitowych liczb całkowitych, co przesuwa datę przepełnienia na rok 292 miliard — bezpiecznie nieistotny dla praktycznych celów.
Jeśli pracujesz z systemami wbudowanymi, starszymi bazami danych lub starym kodem C, warto sprawdzić, jak przechowywane są znaczniki czasu.
Kiedy używać znacznika czasu Unix
Używaj znacznika czasu Unix, gdy:
- Przechowujesz daty w bazie danych i chcesz prostą, sortowalną liczbę całkowitą
- Przekazujesz daty między systemami lub API
- Porównujesz lub sortujesz zdarzenia chronologicznie
- Obliczasz czas trwania (wystarczy odjąć dwa znaczniki czasu)
- Pracujesz z pamięcią podręczną lub logiką wygasania (
expires_at = now + 3600)
Używaj sformatowanego ciągu daty, gdy:
- Wyświetlasz datę użytkownikowi
- Rejestrujesz zdarzenia czytelne dla człowieka
- Pracujesz w arkuszach kalkulacyjnych lub eksportach CSV
Szybkie przeliczenia
| Co | Sekundy |
|---|---|
| 1 minuta | 60 |
| 1 godzina | 3 600 |
| 1 dzień | 86 400 |
| 1 tydzień | 604 800 |
| 30 dni | 2 592 000 |
| 1 rok (w przybliżeniu) | 31 536 000 |
Konwerter znacznika czasu Unix konwertuje dowolny znacznik czasu na czytelną dla człowieka datę lub konwertuje datę na znacznik czasu Unix natychmiast.