Dlaczego Unix ma własną koncepcję czasu? Jaka jest epoka i jaki jest problem Y2038?
Czas w systemie Unix to sposób przedstawiania określonej daty i godziny, używany w systemach Linux, macOS i wielu innych interoperacyjnych systemach. Jest tak rozpowszechniony, że prawdopodobnie używasz go, nie zdając sobie z tego sprawy. Kiedy jednak zrozumiesz czas uniksowy, zauważysz go w wielu kontekstach. Kilka narzędzi może pomóc ci pracować z czasem uniksowym.
Jaki jest cel czasu uniksowego?
Czas systemu UNIX to suma sekund od ustalonej godziny i daty. To format daty / godziny (lub sygnatury czasowej), który wygląda inaczej niż czytelne dla człowieka daty i godziny, do których jesteśmy przyzwyczajeni. Dzieje się tak wyłącznie ze względu na wydajność. Przechowywanie pojedynczej liczby reprezentującej sekundy zajmuje o wiele mniej miejsca niż przechowywanie oddzielnych wartości dla roku, miesiąca, godziny itp.
Oczywiście, biorąc pod uwagę współczesność, różnica przestrzenna wcale nie jest taka duża. Ale weźmy pod uwagę, że Unix powstał pod koniec lat sześćdziesiątych, kiedy dostępna pamięć była znacznie mniejsza. Znaczniki czasu są również często używane, więc ich miejsce na dane się sumuje. Na przykład z każdym plikiem są powiązane trzy sygnatury czasowe.
Format jest prawie niemożliwy do przetłumaczenia w twojej głowie, chyba że jesteś geniuszem matematycznym. Ale nadal ma pewne zalety w stosunku do bardziej czytelnych alternatyw, takich jak Śr, 21 października 2015, 07:28:00 GMT. Możesz bardzo łatwo zamówić dwa uniksowe znaczniki czasu, na pierwszy rzut oka. Zwykle szybciej jest też obliczyć różnicę między dwoma sygnaturami czasowymi. Jest to szczególnie ważne w przypadku dat blisko siebie, na przykład w sąsiednich dniach.
O epoce
Tak więc czas systemu Unix to całkowita liczba sekund od określonego momentu w czasie. Ale jaki to jest moment w czasie? Jego 00:00:00 UTC na 1 stycznia 1970. Jest to często określane jako Epoka Uniksa. Programiści wybrali tę datę na epokę dla wygody, ponieważ była to najbliższa okrągła data wynalezienia czasu uniksowego.
Być może widzieliście tę datę, kiedy coś poszło nie tak. Jest to oczywiście błąd, ale wygląda bardzo dziwnie, gdy skutkuje datą sprzed narodzin wielu z nas! Jest to jednak całkowicie zrozumiałe, gdy wiesz o czasie uniksowym. Jeśli jakikolwiek system próbuje wyświetlić sygnaturę czasową, która nie ma żadnej wartości, często jest tłumaczona na 0 i skutkuje dokładną datą epoki.
Unix Time Data Format
Ściśle mówiąc, nie ma takiego. Pierwotny typ danych był 32-bitową liczbą całkowitą i często tak jest, nawet w znacznie potężniejszych systemach.
Ten typ danych pozwala na przechowywanie wartości w sumie 2 ^ 32 sekundy, czyli nieco ponad 136 lat. Ta wartość jest zwykle podpisana, co oznacza, że może być ujemna lub dodatnia. Tak więc zwykle przedstawia 68 lat po obu stronach epoki, tj. 1902-2038.
Oczywiście jest to nadal ograniczony okres. Jednak głównym zastosowaniem formatu sygnatury czasowej były koncepcje takie jak modyfikacja plików. Bardzo potrzebna była reprezentacja czasu bliskiego teraźniejszości, a nie historii starożytnej lub dalekiej przyszłości. Nawet w przypadku aplikacji, takich jak kalendarze, rzadko zachodzi potrzeba reprezentowania dat obejmujących więcej niż kilka dziesięcioleci w przyszłości.
Ale to nie znaczy, że ten ograniczony czas jest bezproblemowy…
Problem roku 2038
Błąd Y2K (jeden z najgorszych błędów programistycznych w historii) dotyczyło systemów komputerowych, które zapisywały lata jako wartości dwucyfrowe. Kiedy nadszedł rok 2000, takie systemy traktowały go tak, jakby to był rok 1900. W rzeczywistości nie było to tak katastrofalne, jak się obawiano, głównie dlatego, że wiele osób poświęciło dużo czasu i wysiłku, przygotowując się do tego.
W swojej historycznej przeszłości kodował również zniszczenia. Wystąpienia niewielkiego fragmentu złego kodu spowodowały katastrofę na dużym poziomie. Poniżej znajduje się 10 najgorszych błędów programistycznych w historii.
Jeśli zwracałeś uwagę w poprzedniej sekcji, być może zauważyłeś podobny problem, który może mieć wpływ na czas w systemie Unix. Cóż, czas uniksowy ma swój własny problem z danymi: problem Y2k38. (Często określa się to jako problem, a nie błąd; być może staliśmy się bardziej optymistyczni od 2000 roku!). Kiedy w 2038 roku uniksowy czas dosłownie się skończy, systemy będą traktować nowe daty jako rok 1902 lub 1970. A może po prostu poniosą całkowitą porażkę.
Przynajmniej ten problem nie dotknie nas z wybiciem północy w sylwestra. Ostatnia sekunda 32-bitowego czasu uniksowego przypada 19 marca. W ostateczności prawdopodobnie zaktualizujemy większość systemów do 2038 r. W przeciwnym razie i tak będą one przestarzałe.
Przydatne zasoby sygnatur czasowych
Plik Konwerter epok site jest prawdopodobnie najbardziej wszechstronnym dostępnym konwerterem znaczników czasu. Rozpoczyna się wyświetlaniem aktualnego czasu systemu Unix - w czasie rzeczywistym - i dodaje do tego prawie każdą możliwą do wyobrażenia funkcję. Jego głównym zastosowaniem jest konwersja między znacznikami czasu i datami czytelnymi dla człowieka, w obu kierunkach.
Dan’s Tools to ogromna kolekcja przydatnych aplikacji internetowych, z których jedna to konwerter znacznika czasu. Jest prostszy, ale ma bardzo przejrzystą prezentację i jest łatwy w użyciu.
Czas jest prezentuje inny, jeszcze bardziej minimalistyczny wygląd. Pokazuje czas w wielu formatach, w tym czas w systemie Unix. Zawiera on aktualny czas w tytule strony, co jest przydatne.
W systemach Linux i macOS data program jest podstawowym narzędziem do obsługi daty / czasu, w tym znaczników czasu systemu Unix. Wywoływana bez żadnych argumentów zwraca bieżącą datę / godzinę w formacie czytelnym dla człowieka:
$ date
Śr, 10 lutego, 12:28:30 GMT 2021
Jeśli potrzebujesz bieżącej daty / godziny w czasie uniksowym, użyj rozszerzenia +% s argument:
$ data +% s
1612960114
Możesz przekonwertować datę czytelną dla człowieka na sygnaturę czasową przy użyciu rozszerzenia -re flag, jeśli twoja wersja data wspiera to. Większość wersji Linuksa powinna domyślnie:
$ date -d "2 stycznia 1970" +% s
82800
W systemie macOS data to inny program, który wymaga innego zestawu flag:
$ date -j -f "% b% d% Y% T" "2 stycznia 1970 00:00:00" "+% s"
82800
Idąc w drugą stronę, możesz przekonwertować z uniksowego znacznika czasu przy użyciu rozszerzenia -r flaga:
$ date -r 1600000000
Niedz. 13 wrz 2020 13:26:40 BST
Niektóre inne programy używają rozszerzenia % s format do obsługi czasu uniksowego. Na przykład, jeśli chcesz wyświetlić datę modyfikacji pliku w czasie uniksowym, z rozszerzeniem Wersja dla systemu Linux lsmożesz użyć:
$ ls -l --time-style = +% s index.tmp.html
-rw-r - r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html
Jak używać czasu uniksowego w językach programowania
PHP ma rozszerzenie czas() funkcja, która zwraca bieżący znacznik czasu systemu Unix. Jego data() funkcja przyjmuje znacznik czasu jako drugi argument:
$ php -r 'echo date ("Y-m-d", time ());'
2021-02-11
JavaScript podchodzi do rzeczy w interesujący sposób. To ma Date.now () metoda, aby uzyskać liczbę milisekund, które upłynęły od epoki systemu Unix. Oczywiście możesz to podzielić przez 1000 i zaokrąglić wynik, aby uzyskać równoważny czas Uniksa w sekundach:
> Math.floor (Date.now () / 1000)
1613083012
Zrozumienie czasu uniksowego
Czas uniksowy to prosta koncepcja, która pojawia się w wielu miejscach. Kiedy już to zrozumiesz, może Ci się to przydać, na przykład przy obliczaniu różnic czasowych. Możesz także rozpoznać, kiedy może to być przyczyną niektórych błędów.
Pojęcia takie jak epoka i znaczniki czasu są ważną częścią rozpoczynania pracy z Linuksem. Aby dowiedzieć się więcej o podstawowych funkcjach, takich jak ls, zapoznaj się z naszym przewodnikiem po podstawowych poleceniach systemu Linux.
Chcesz poznać Linuksa? Zacznij od tych podstawowych poleceń systemu Linux, aby nauczyć się standardowych zadań obliczeniowych.
- Nieokreślony
Bobby jest entuzjastą technologii, który przez prawie dwie dekady pracował jako programista. Pasjonuje się grami, pracuje jako redaktor recenzji w Switch Player Magazine i jest pochłonięty wszystkimi aspektami publikacji online i tworzenia stron internetowych.
Zapisz się do naszego newslettera
Dołącz do naszego biuletynu, aby otrzymywać wskazówki techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Jeszcze jeden krok…!
Potwierdź swój adres e-mail w wiadomości e-mail, którą właśnie wysłaliśmy.