Uniksowe znaczniki czasu szczegółowo: Konwersja między formatami
Uniksowe znaczniki czasu są jednym z najbardziej podstawowych pojęć w informatyce, ale wielu programistów i specjalistów ds. danych nadal ma z nimi trudności. Niezależnie od tego, czy debugujesz odpowiedzi API, analizujesz pliki dziennika, czy budujesz systemy harmonogramowania, zrozumienie działania uniksowych znaczników czasu i sposobu konwersji między formatami jest niezbędną umiejętnością.
Czym jest uniksowy znacznik czasu?
Uniksowy znacznik czasu, znany również jako czas epoch lub czas POSIX, to liczba sekund, które upłynęły od 1 stycznia 1970 00:00:00 UTC (z wyłączeniem sekund przestępnych). Ten punkt odniesienia nazywany jest epoką Unix. Znaczniki czasu są przechowywane jako pojedyncza liczba całkowita, co ułatwia porównywanie, sortowanie i obliczanie różnic czasu.
Na przykład, uniksowy znacznik czasu 1700000000 odpowiada 14 listopada 2023 22:13:20 UTC. Prostota reprezentowania czasu jako pojedynczej liczby sprawia, że uniksowe znaczniki czasu są standardem reprezentacji czasu w systemach operacyjnych, bazach danych i językach programowania.
Dlaczego używać uniksowych znaczników czasu
- Uniwersalne i jednoznaczne: Znaczniki czasu zawsze używają UTC, eliminując zamieszanie spowodowane strefami czasowymi i zmianami czasu letniego.
- Łatwe do porównania: Porównywanie dwóch znaczników czasu to proste porównanie liczb całkowitych, co ułatwia określenie, które zdarzenie nastąpiło pierwsze, lub obliczenie różnicy czasu.
- Kompaktowe przechowywanie: Pojedyncza 32-bitowa lub 64-bitowa liczba całkowita zajmuje znacznie mniej miejsca niż sformatowany string daty.
- Niezależne od języka: Każdy język programowania i system baz danych może natywnie obsługiwać uniksowe znaczniki czasu.
- Operacje arytmetyczne: Dodawanie i odejmowanie czasu jest tak proste, jak dodawanie i odejmowanie sekund od wartości całkowitej.
Popularne formaty znaczników czasu
Różne systemy używają różnych formatów znaczników czasu. Zrozumienie tych różnic pomaga dokładnie konwertować między nimi.
| Format | Przykład | Używany przez |
|---|---|---|
| Unix sekundy | 1700000000 | Linux, API, bazy danych |
| Unix milisekundy | 1700000000000 | JavaScript, Java |
| Unix mikrosekundy | 1700000000000000 | Python, Go |
| ISO 8601 | 2023-11-14T22:13:20Z | REST API, JSON |
| RFC 2822 | Tue, 14 Nov 2023 22:13:20 +0000 | Nagłówki e-mail, HTTP |
Konwersja uniksowych znaczników czasu na czytelną datę
W JavaScript
JavaScript reprezentuje znaczniki czasu w milisekundach. Aby przekonwertować uniksowy znacznik czasu w sekundach na obiekt Date JavaScript, najpierw pomnóż przez 1000. Następnie użyj metod takich jak toLocaleString() lub toISOString() do sformatowania wyniku.
W Pythonie
Moduł datetime Pythona oferuje metodę fromtimestamp() do konwersji uniksowych znaczników czasu na obiekty datetime. Python obsługuje również znaczniki czasu z precyzją mikrosekundową poprzez datetime.fromtimestamp(ts, tz=timezone.utc).
W wierszu poleceń
Na Linux i macOS polecenie date może konwertować znaczniki czasu. Użyj date -d @1700000000 na Linux lub date -r 1700000000 na macOS, aby uzyskać czytelną datę z uniksowego znacznika czasu.
Korzystanie z narzędzi online
Najszybszym sposobem konwersji znaczników czasu jest użycie konwertera online. Wklej swój znacznik czasu, a narzędzie natychmiast wyświetli odpowiadającą datę i godzinę (w wielu formatach). Wypróbuj nasz darmowy konwerter znaczników czasu do szybkich konwersji.
Konwersja daty na uniksowy znacznik czasu
Odwrotna konwersja — przekształcanie czytelnej daty na uniksowy znacznik czasu — jest równie ważna. Jest to często potrzebne przy wysyłaniu dat do API, przechowywaniu dat wybranych przez użytkownika lub planowaniu przyszłych zdarzeń.
W JavaScript utwórz obiekt Date i wywołaj getTime(), aby uzyskać znacznik czasu w milisekundach, a następnie podziel przez 1000, aby uzyskać sekundy. W Pythonie użyj datetime.timestamp(), aby bezpośrednio uzyskać uniksowy znacznik czasu. Większość języków programowania oferuje podobne wbudowane metody.
Problem roku 2038
Systemy używające 32-bitowych liczb całkowitych ze znakiem do przechowywania uniksowych znaczników czasu przepełnią się 19 stycznia 2038 o 03:14:07 UTC. W tym momencie znacznik czasu osiągnie 2147483647, maksymalną wartość 32-bitowej liczby całkowitej ze znakiem, a następnie przekręci się do wartości ujemnych, powodując wyświetlanie dat z 1901 roku.
Ten problem jest znany jako problem roku 2038 lub Y2K38 i dotyczy starszych systemów oraz urządzeń wbudowanych. Rozwiązaniem jest używanie 64-bitowych liczb całkowitych do przechowywania znaczników czasu, co rozszerza reprezentowalny zakres do około 292 miliardów lat. Większość nowoczesnych systemów operacyjnych, baz danych i języków programowania przeszła już na 64-bitowe znaczniki czasu.
Obsługa stref czasowych
Uniksowe znaczniki czasu zawsze używają UTC, eliminując niejednoznaczność stref czasowych. Jednak wyświetlanie znaczników czasu użytkownikom wymaga konwersji na ich lokalną strefę czasową. Oto kluczowe uwagi:
- Przechowuj znaczniki czasu w bazie danych jako UTC, konwertuj na czas lokalny tylko przy wyświetlaniu użytkownikom
- Używaj identyfikatorów bazy stref czasowych IANA (np. "America/New_York") zamiast skrótów (np. "EST"), aby poprawnie obsługiwać czas letni
- Zawsze dołączaj informacje o strefie czasowej w odpowiedziach API, najlepiej używając formatu ISO 8601 z przesunięciem UTC
- Zwróć uwagę, że niektóre regiony nie stosują czasu letniego, a zasady często się zmieniają
Częste pułapki
- Mylić sekundy z milisekundami podczas pracy między JavaScript a innymi językami
- Zapominać o uwzględnieniu strefy czasowej podczas wyświetlania znaczników czasu
- Używać 32-bitowych liczb całkowitych do przechowywania znaczników czasu na systemach zbliżających się do limitu roku 2038
- Nie obsługuje ujemnych znaczników czasu dla dat przed 1 stycznia 1970
- Zakładać, że wszystkie dni mają 86400 sekund podczas wykonywania arytmetyki dat na granicach czasu letniego
Potrzebujesz konwersji między uniksowymi znacznikami czasu a czytelnymi datami? Wypróbuj nasz darmowy konwerter znaczników czasu.
Wypróbuj konwerter znaczników czasuFAQ
Czym jest epoka Unix?
Epoka Unix to 1 stycznia 1970 00:00:00 UTC. Służy jako punkt odniesienia dla wszystkich obliczeń uniksowych znaczników czasu. Znacznik czasu reprezentuje liczbę sekund, które upłynęły od tego momentu.
Czy uniksowe znaczniki czasu się wyczerpią?
Znaczniki czasu Unix jako 32-bitowe liczby całkowite ze znakiem przekroczą zakres 19 stycznia 2038 roku, znane jako problem roku 2038. Systemy używające 64-bitowych liczb całkowitych nie będą miały tego problemu przez około 292 miliardy lat. Większość nowoczesnych systemów przeszła na 64-bitowe znaczniki czasu.
Czy uniksowe znaczniki czasu zależą od strefy czasowej?
Nie, uniksowe znaczniki czasu zawsze używają UTC i nie zależą od strefy czasowej. Ten sam znacznik czasu reprezentuje ten sam moment na całym świecie. Konwersja strefy czasowej zachodzi tylko podczas wyświetlania znacznika czasu jako czytelnej daty.
Jaka jest różnica między sekundami a milisekundami w znacznikach czasu?
Standardowe uniksowe znaczniki czasu mierzą czas od epoki w sekundach, podczas gdy JavaScript i niektóre API używają milisekund. Milisekundowe znaczniki czasu są 1000 razy większe niż znaczniki sekundowe. Na przykład, 1700000000 sekund to 1700000000000 milisekund.
Czy sekundy przestępne wpływają na uniksowe znaczniki czasu?
Technicznie rzecz biorąc, uniksowe znaczniki czasu ignorują sekundy przestępne. Każdy dzień jest traktowany jako mający dokładnie 86400 sekund. Oznacza to, że gdy wstawiana jest sekunda przestępna, czas Unix może nieznacznie odbiegać od UTC, ale w praktyce rzadko powoduje to problemy.