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/25 to 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:

FormatJednostkaPrzykład
Unix (POSIX)Sekundy1711929600
JavaScript Date.now()Milisekundy1711929600000
Python time.time()Sekundy (zmiennoprzecinkowe)1711929600.123
Znaczniki czasu bazy danychCzęsto mikrosekundy1711929600000000

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

CoSekundy
1 minuta60
1 godzina3 600
1 dzień86 400
1 tydzień604 800
30 dni2 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.