Czas Unix lub czas POSIX (zwany także Unix timestamp ) jest miarą czasu w oparciu o liczbę sekund od1 st styczeń 197000:00:00 UTC , z wyłączeniem sekund przestępnych . Jest używany głównie w systemach zgodnych ze standardem POSIX , w tym w systemach uniksopodobnych , stąd jego nazwa. Jest to reprezentacja czasu w standardzie POSIX.
Aby skojarzyć zdarzenie z liczbą rzeczywistą, wystarczy posłużyć się odniesieniami naturalnymi i uniwersalnymi, np. Okresowymi cyklami obrotu Ziemi nad nią i wokół Słońca. Te okresy są wystarczające do ustalenia kalendarzy , to znaczy relacji między wydarzeniami i datami, nawet jeśli konieczne jest podjęcie pewnego wysiłku, aby jasno zdefiniować używane odniesienia (każdy kraj ma swoje własne, wszystkie przyjęte w innym czasie); daty tych kalendarzy są po prostu liczbami wyrażonymi w nieco skomplikowanym systemie numeracyjnym, w którym jednostkami są dzień, tydzień, miesiąc, pora roku, rok itd., a czas Posix to nie tylko odniesienie między innymi wyrażone jako prosta liczba.
Główne stosowane systemy pomiaroweOto główne systemy pomiaru czasu, które zostały wyobrażone i używane do dziś:
Akronim | Znaczenie | Definicja |
---|---|---|
GMT | Czas środkowoeuropejski | Nadal w użyciu w niektórych krajach ze względów prawnych.
Jednak definicja tego systemu pomiarowego jest niejednoznaczna. To jest powód, dla którego oprócz tego administracyjnego zastosowania lepiej jest używać UTC. |
Ut | Czas uniwersalny | Ten system definiuje dzień jako średni czas trwania obrotu Ziemi wokół własnej osi.
Definicja ta stwarza pewne trudności, ponieważ prędkość tego obrotu nie jest stała, powoli spada pod wpływem pływów, a ponadto przedstawia nieprzewidywalne nieprawidłowości: czas trwania dni UT jest średnio bardzo nieznacznie dłuższy niż 86400 sekund ( liczba sekund w ciągu 24 godzin). Różnica jest rzędu jednej sekundy w okresie od jednego do trzech lat. Istnieje kilka wersji UT: UT0, UT1, UT1R, UT2. Więcej informacji można znaleźć w artykule „ Czas uniwersalny ” . |
TAI | Międzynarodowy czas atomowy | System ten oparty jest na międzynarodowej definicji drugiego. Jego standard składa się z kilku zegarów atomowych rozmieszczonych na całym świecie. Pomiar czasu w tym systemie jest ściśle regularny, w przeciwieństwie do poprzedniego, dla którego jego norma nie ma takiej samej regularności. W rezultacie TAI i UT stopniowo oddalają się od siebie z powodu spowolnienia sekundy.
|
UTC | Skoordynowany czas uniwersalny |
System ten jest przyjmowany jako podstawa międzynarodowego czasu cywilnego przez wiele krajów. Słowo „skoordynowane” wskazuje, że:
Innymi słowy, UTC jest identyczny z TAI (ma swoją stabilność i dokładność) aż do całkowitej liczby sekund, co pozwala mu trzymać się UT z dokładnością do 0,9 s ; to właśnie pokazuje rysunek obok.
|
Aby zmierzyć czas, musisz wybrać źródło:
Konieczne jest wskazanie, jak ta liczba zmienia się wraz z upływem czasu:
# | TAI | UTC | TAI - UTC | Czas Posix | |
---|---|---|---|---|---|
1 | 2009-01-01T00: 00: 30 | 2008-12-31T23: 59: 57 | 33 | 1,230,767,997 | |
2 | 2009-01-01T00: 00: 31 | 2008-12-31T23: 59: 58 | 33 | 1,230,767,998 | |
3 | 2009-01-01T00: 00: 32 | 2008-12-31T23: 59: 59 | 33 | 1,230,767,999 | |
4 | 2009-01-01T00: 00: 33 | 2008-12-31T23: 59: 60 | 33 | 1 230 768 000 | dodanie sekundy przestępnej |
5 | 2009-01-01T00: 00: 34 | 2009-01-01T00: 00: 00 | 34 | 1 230 768 000 | |
6 | 2009-01-01T00: 00: 35 | 2009-01-01T00: 00: 01 | 34 | 1.230.768.001 | |
7 | 2009-01-01T00: 00: 36 | 2009-01-01T00: 00: 02 | 34 | 1230,768,002 |
Czas Posix nie jest liniową reprezentacją czasu, istnieją anomalie, takie jak wiersz 5 powyższej tabeli.
Brak bijektywu korespondencji między czasem UTC i czasem Posix; ta ostatnia nie pozwala na przedstawienie sekund przestępnych obecnych w UTC, jak wiersz 4 powyższej tabeli: 2008-12-31T23: 59: 60 UTC.
Te różne odniesienia nie powinny być pomieszane (na przykład rok zerowy jednego kalendarza nie rozpoczyna się w tym samym czasie co inny), a także dlatego, że wszystkie te kalendarze muszą dostosowywać się do nie wielu okresów. Od siebie nawzajem, na przykład lata przestępne lub nieprawidłowości tych okresów. Te dostosowania nieco komplikują obliczenia, w zależności od dokładności, której szukasz; na przykład rok, który upłynął, może być wystarczającą informacją lub konieczne będzie uwzględnienie skokowego charakteru roku, aby odpowiedzieć na to samo pytanie wyrażone w liczbie dni. Oznacza to, że musimy zachować pamięć o przeszłości, pamięć każdej mijającej sekundy.
W większości przypadków prosta różnica w czasach Posix jest wystarczająca, chyba że dwa zdarzenia przypadają na jedną lub więcej sekund przestępnych. Aby obliczyć dokładne opóźnienie we wszystkich okolicznościach, należy wziąć pod uwagę sekundy przestępne.
Jednak występowanie sekund przestępnych jest małe, więc prawdopodobieństwo popełnienia takiego błędu jest małe; a jeśli mimo wszystko sprawa ma miejsce, to skala błędu może być niewielka i nie ma potrzeby martwić się o te sekundy przestępne w tym przypadku; Poniższa tabela przedstawia różne przykłady.
Metoda uzupełniania wiersza w tej tabeli jest następująca:
Zastosowanie tej metody dla czasów M = 10, 100, 1000 daje następującą tabelę:
Czas na pomiar (M) | Prawdopodobieństwo błędu | Skala błędu |
---|---|---|
10 s | 3,2 × 10-7 | 10% |
100 s | 3,2 × 10-6 | 1% |
1000 s | 3,2 x 10-5 | 0,1% |
Ostatecznie, jeśli czas potrzebny na obliczenia między dwoma interesującymi nas zdarzeniami wynosi jeden rok, wówczas prawdopodobieństwo popełnienia błędu 3,2 × 10-8 wynosi 100% .
Prawdopodobieństwo popełnienia danego błędu i wielkość tego błędu zmieniają się odwrotnie; Innym sposobem może być powiedzenie:
Jeśli ta para (prawdopodobieństwo popełnienia błędu / wielkość błędu) jest niedopuszczalna lub jeśli nie wiemy, jak ocenić wpływ, to z pewnością konieczne jest pytanie, dlaczego używamy UTC i jaka jest potrzeba niezbędną precyzję lub zapewnienie, że korzystanie z tabel będzie aktualizowane, gdy tylko zostanie zaprogramowane wstawienie / usunięcie sekundy przestępnej .
Konwersja czasu UTC na czas PosixOprócz bardzo rzadkich anomalii wymienionych powyżej dotyczących sekund przestępnych, łatwo jest przekonwertować czas UTC na czas Posix i odwrotnie.
Przykład: jaki jest czas Posix na samym początku dnia 1 st styczeń 2009(wiersz 5 tabeli 1 powyżej):
Liczba dni, które minęły | ||||
---|---|---|---|---|
1,970 | 1 971, | 1 972, | 1 973, | 3 * 365 + 366 = 1461 |
1,974 | 1 975, | 1 976, | 1 977, | 1461 |
1 978, | 1 979, | 1 980, | Dziewiętnaście osiemdziesiąt jeden | 1461 |
1 982, | 1 983, | 1 984, | 1 985, | 1461 |
1,986 | 1 987, | 1 988, | 1 989, | 1461 |
1990 | 1,991 | 1,992 | 1,993 | 1461 |
1 994, | 1,995 | 1,996 | 1997 | 1461 |
1,998 | 1,999 | 2000 | 2,001 | 1461 |
2,002 | 2,003 | 2004 | 2,005 | 1461 |
2,006 | 2,007 | 2,008 | 2 * 365 + 366 = 1096 | |
14 245, |
Istnieją również narzędzia, które wykonują te obliczenia w bardzo prosty sposób, takie jak ten „skrypt powłoki”, który zamienia liczbę sekund od ery Posix na datę:
#!/bin/sh # convertir un nombre de secondes depuis l'époque Posix # en date # exemple: date -u -R --date "1970-01-01 1230768000 seconds" date -u -R --date "1970-01-01 $* seconds" Konwersja czasu Posix na czas UTCOdwrotne obliczenie nie przedstawia żadnej trudności i podobnie istnieją narzędzia, które wykonują te obliczenia w bardzo prosty sposób, takie jak ten skrypt bash do konwersji daty na liczbę sekund od epoki Posixa:
#!/bin/sh # convertir une date (attention au format de l'argument) # en nombre de secondes depuis l'époque Posix # exemple: date --date "2009-01-01 00:00:00+00:00" "+%s" date --date "$*" "+%s"Najpopularniejszą metodą odczytywania czasu w systemie Unix jest wywołanie następującej funkcji, która zwraca wartość liczbową typu „ time_t”.
time_t time(NULL);Ten typ time_t jest powszechnie używany do manipulowania czasem UNIX, niestety standard POSIX nie określa (wyraźnie) jego rozmiaru:
Czas uniksowy | UTC | |
---|---|---|
najwcześniejszy termin: -2 31 | -2 147 483 648 | 1901-12-13 T 20:45:52 |
Era systemu Unix: 0 | 0 | 1970-01-01 T 00:00:00 |
Najwcześniejsze data: 2 31 -1 | 2,147,483,647 | 2038-01-19 T 03:14:07 |
Ta niemożność przedstawienia niekoniecznie podważa działanie samej maszyny, to znaczy działanie jej systemu operacyjnego, ale działanie jej aplikacji i jej współdziałanie z innymi maszynami. Rzeczywiście, nie wystarczy, aby maszyna wiedziała, jak lokalnie zarządzać tym limitem, ale konieczne jest również, aby wszystkie maszyny, które są do niej podłączone, były w stanie zarządzać tym limitem i to w ten sam sposób.
Może wystąpić kilka przypadków:
Systemy uniksowe generalnie obsługują licznik, którego rozdzielczość jest dokładniejsza niż sekunda. Dostęp do tego czasu można uzyskać, wywołując następującą funkcję:
int gettimeofday(struct timeval *tv, NULL);Wartość liczbowa zwracana przez tę funkcję jest przechowywana w zmiennej „ struct timeval *tv ” zdefiniowanej w następujący sposób:
struct timeval { int tv_sec; /* secondes */ int tv_usec; /* microsecondes de 0 à 999999 */ };Korzystanie z rozdzielczości poniżej sekundy nasuwa pytanie, co się dzieje, gdy sekunda przestępna jest dodawana lub odejmowana? Wydaje się, że za ten punkt odpowiada system operacyjny. W przypadku braku jasnej specyfikacji możliwych jest zatem kilka scenariuszy w zależności od rozważanego systemu operacyjnego. Trzy poniższe przykłady pokazują trzy kategorie spraw, które wydają się najbardziej reprezentatywne, dotyczą one tylko aspektu wstawiania sekundy przestępnej, ale można je łatwo dostosować do przypadku usunięcia:
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 2008-12-31T23: 59: 60.000 | 1 230 768 000 | 0 | |
2008-12-31T23: 59: 60.500 | 1 230 768 000 | 500 000 | ||
5 | 2009-01-01T00: 00: 00.000 | 1 230 768 000 | 0 | czas nagle się dostosował |
2009-01-01T00: 00: 00.500 | 1 230 768 000 | 500 000 | ||
6 | 2009-01-01T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 2008-12-31T23: 59: 60.000 | 1 230 768 000 | 0 | |
2008-12-31T23: 59: 60.500 | 1 230 768 000 | 0 | zamarznięta godzina | |
5 | 2009-01-01T00: 00: 00.000 | 1 230 768 000 | 0 | zamarznięta godzina |
2009-01-01T00: 00: 00.500 | 1 230 768 000 | 500 000 | ||
6 | 2009-01-01T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 2008-12-31T23: 59: 60.000 | 1 230 768 000 | 0 | |
2008-12-31T23: 59: 60.500 | 1 230 768 000 | 250 000 | zwolnił godzinę | |
5 | 2009-01-01T00: 00: 00.000 | 1 230 768 000 | 500 000 | zwolnił godzinę |
2009-01-01T00: 00: 00.500 | 1 230 768 000 | 750 000 | zwolnił godzinę | |
6 | 2009-01-01T00: 00: 01.000 | 1.230.768.001 | 0 |
Pomysł wykorzystania międzynarodowego czasu atomowego był już proponowany i broniony przez wiele osób, ale nie takie znaczenie nadała historia, wybrany wybór był tym, który jest dziś zamrożony przez standard POSIX.
Daniel J. Bernstein napisał również artykuły i oprogramowanie do używania TAI w systemach typu UNIX.
Unix gigasecond odnosi się do uniksowej godziny 10 9 , która reprezentuje9 września 2001.