Unixový čas: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
{{subst:Přeložit}} - nedostatečně upravený strojový překlad
Předělání úvodu
Řádek 1: Řádek 1:
'''Unixový čas''' je systém pro označení [[čas]]ových okamžiků. Systém identifikuje časové okamžiky pomocí počtu [[sekunda|sekund]] uplynulých od okamžiku [[Coordinated Universal Time|koordinovaného světového času]] (UTC) 00:00:00 1. ledna 1970, ale bez započítání [[přestupná sekunda|přestupných sekund]]. Unixový čas je používán zejména v [[UN*X|operačních systémech založených na Unixu]], ale i v dalších [[operační systém|operačních systémech]] a [[formát souboru|souborových formátech]].

Ignorování přestupných sekund znamená, že unixový čas není ani lineární reprezentací času, ani přesnou reprezentací koordinovaného světového času.

Zjistit aktuální unixový čas lze na většině unixových systémů zadáním <code>date +%s</code> do příkazového řádku.

{{Přeložit|20140925100231}}
{{Přeložit|20140925100231}}
'''Unixový čas''' (nebo také ''POSIX'' nebo ''Epoch time'') je systém pro popisování času, definovaných jako počet sekund uplynulých od okamžiku 00:00:00 (Epocha Unixu) koordinovaného světového času ([[UTC]]). Unixová epocha byla určena na čtvrtek 1. 1. 1970 (přestupné sekundy nebyly započítány). Tento systém je používán nejen v systémech založených na [[Linux]]u a popisu systémových souborů. Díky svému přístupu, kdy se jeho základ (UTC) potýká s přechodnými sekundami se nejedná ani o lineární reprezentaci času, ani o reprezentaci koordinovaného světového času, který tyto sekundy nezohledňuje. Zjistit aktuální linuxový čas můžeme na většině linuxových systémů zadáním ''date +%s'' do příkazového řádku.


==Definice==
==Definice==

Verze z 27. 9. 2014, 20:48

Unixový čas je systém pro označení časových okamžiků. Systém identifikuje časové okamžiky pomocí počtu sekund uplynulých od okamžiku koordinovaného světového času (UTC) 00:00:00 1. ledna 1970, ale bez započítání přestupných sekund. Unixový čas je používán zejména v operačních systémech založených na Unixu, ale i v dalších operačních systémech a souborových formátech.

Ignorování přestupných sekund znamená, že unixový čas není ani lineární reprezentací času, ani přesnou reprezentací koordinovaného světového času.

Zjistit aktuální unixový čas lze na většině unixových systémů zadáním date +%s do příkazového řádku.

Definice

Unixový čas je tvořen dvěma vrstvami kódu, jejichž oddělení těchto může být velmi užitečné. První vrstva kóduje časové okamžiky jako skalární reálné číslo, druhá jako posloupnost bitů nebo decilmálních číslic. Unixový čas přejímá standardy UTC a dělí čas každého dne podle gregoriánského kalendáře do sekund, minut a hodin. Narozdíl od UTC ale nezohledňuje přestupné sekundy, tím pádem ztrácí synchronicitu se zemskou rotací, tuto vlastnost přebírá od Mezinárodního atomového času (TAI). Rotace Země se totiž zpomaluje, proto by bylo k udržení synchronicity nutné přičíst zhruba sekundu každý rok a půl.

Unixový čas je jednoduché číslo, které narůstá o jednu jednotku každou sekundu, funguje tedy bez členění na roky, měsíce nebo dny, které jsou potřebné pro vyjadřování času lidmi. Moderní unixové systémy založené na UTC počítají SI sekundy, tyto sekundy pak 86400 - tedy na dny.

Unix epoch je čas 00:00:00 UTC k 1.1.1970 (neboli 1970-01-01T00:00:00Z ISO 8601). Problém je, že UTC v současné formě existuje až od roku 1972.

Reprezentace času jedním číslem

Unixový čas i čas Unix epoch narůstají každým dnem o 86400, to znamená, že datum 2004-09-16T00:00:00Z, 12677 dní po 1.1.1970 je Unixovém čase 12677×86400 = 1095292800. Stejně by se vypočítaly i hodnoty dat před začátkem odpočítávání, jediným rozdílem by bylo záporné znaménko před číslem.

Během každého dne je Unixový čas vypočítáván z počtu dosud uplynulých sekund do předešlé půlnoci a připočítává se počet sekund uplynulých daný den.

Výše zmíněné schéma znamená, že normální UTC den trvá 86400 sekund, V následující tabulce je znázorněn TAI, UTC a Unixový čas v okamžicích kolem půlnoci. V jednotlivých sloupcích můžeme pozorovat rozdíly mezi časovými modely. Pro připomenutí, Mezinárodní atomový čas (TAI) není synchronizovaný s rotací Země. V září 2004 byl rozdíl mezi TAI a UTC 32 sekund. K UTC bylo celkem tou dobou připočteno právě těchto 32 přechodných sekund.

Unixový čas přes půlnoc 17.9.2004
TAI (17.9.2004) UTC (16 na 17 září 2004) Unixový čas
2004-09-17T00:00:30.75 2004-09-16T23:59:58.75 1 095 379 198.75
2004-09-17T00:00:31.00 2004-09-16T23:59:59.00 1 095 379 199.00
2004-09-17T00:00:31.25 2004-09-16T23:59:59.25 1 095 379 199.25
2004-09-17T00:00:31.50 2004-09-16T23:59:59.50 1 095 379 199.50
2004-09-17T00:00:31.75 2004-09-16T23:59:59.75 1 095 379 199.75
2004-09-17T00:00:32.00 2004-09-17T00:00:00.00 1 095 379 200.00
2004-09-17T00:00:32.25 2004-09-17T00:00:00.25 1 095 379 200.25
2004-09-17T00:00:32.50 2004-09-17T00:00:00.50 1 095 379 200.50
2004-09-17T00:00:32.75 2004-09-17T00:00:00.75 1 095 379 200.75
2004-09-17T00:00:33.00 2004-09-17T00:00:01.00 1 095 379 201.00
2004-09-17T00:00:33.25 2004-09-17T00:00:01.25 1 095 379 201.25


Když se do UTC času promítne přechodná sekunda, to znamená, že se nejedná o standardní den, ale o den, který nemá přesně 86400 sekund. Nyní existují 2 scénáře. Jedná se o sekundu pozitivní, to znamená, že se zemská rotace zpomalila, v tomto případě je přestupná sekunda vložena do času UTC a Unixový čas pokračuje v počítání, ale jakmile skončí počítání vložené přestupné sekundy, sníží své počítadlo o 1. Druhou možností je, že je přestupná sekunda negativní – zemská rotace se zrychlila a k udržení synchronicity je od UTC času odečtena 1 sekunda. V momentě, kdy je v UTC vymazána sekunda, počítadlo Unixového času přičte jednu jednotku. Přičítání nebo odčítání těchto přestupných sekund probíhá vždy o půlnoci.

Následující ukázka zobrazuje situaci v systému POSIX na konci roku 1998, kdy je do UTC vložena přechodná sekunda
TAI (1.1.1999) UTC (31.12.1998 na 1.1.1999) Unixový čas
1999-01-01T00:00:29.75 1998-12-31T23:59:58.75 915 148 798.75
1999-01-01T00:00:30.00 1998-12-31T23:59:59.00 915 148 799.00
1999-01-01T00:00:30.25 1998-12-31T23:59:59.25 915 148 799.25
1999-01-01T00:00:30.50 1998-12-31T23:59:59.50 915 148 799.50
1999-01-01T00:00:30.75 1998-12-31T23:59:59.75 915 148 799.75
1999-01-01T00:00:31.00 1998-12-31T23:59:60.00 915 148 800.00
1999-01-01T00:00:31.25 1998-12-31T23:59:60.25 915 148 800.25
1999-01-01T00:00:31.50 1998-12-31T23:59:60.50 915 148 800.50
1999-01-01T00:00:31.75 1998-12-31T23:59:60.75 915 148 800.75
1999-01-01T00:00:32.00 1999-01-01T00:00:00.00 915 148 800.00
1999-01-01T00:00:32.25 1999-01-01T00:00:00.25 915 148 800.25
1999-01-01T00:00:32.50 1999-01-01T00:00:00.50 915 148 800.50
1999-01-01T00:00:32.75 1999-01-01T00:00:00.75 915 148 800.75
1999-01-01T00:00:33.00 1999-01-01T00:00:01.00 915 148 801.00
1999-01-01T00:00:33.25 1999-01-01T00:00:01.25 915 148 801.25

Všimněte si, že když se objeví přestupná sekunda (např. je přestupná sekunda vložena = pozitivní přestupná sekunda) Unixový čas zopakuje své hodnoty. Například číslo 915148800.50 je nejasným časovým otiskem – může odkazovat buď na čas během přestupné sekundy a nebo na vteřinu potom – vteřinu a půl po půlnoci času UTC. V teoretickém případě se může naskytnou negativní přestupná sekunda (např. přestupná sekunda je vymazána) – žádná nejednoznačnost není způsobena, ale několik hodnot Unixového času by neukazovalo na žádný okamžik.

Pokud se budeme zabývat časovým úsekem, který nebude obsahovat žádné UTC přestupné sekundy, rozdíl mezi dvěma Unixovými časy bude roven počtu sekund mezi těmito časovými body. Jakmile se ale nějaká přestupná sekunda objeví, náš výsledek nebude správně. V případech, kdy bude potřeba takové přesnosti, že rozdíl v řádech několika sekund nebude zanedbatelný, budeme muset náš výpočet upravit podle tabulky přestupných vteřin, nebo raději zvolit pro práci jiný způsob kódování času, který podobným problémem netrpí.

Unixový čas je jednoduše převeditelný na UTC celočíselným dělením 86400. Výsledkem bude počet dní uplynulých od Unixové Epochy a zbytek je počet sekund uplynulých z již započatého dne. Pokud budeme mít číslo Unixového času odkazující právě na pozitivní přestupnou sekundu, algoritmus ho vyhodnotí jako čas těsně po půlnoci. Pokud budeme mít negativní sekundu, výsledkem bude neexistující UTC čas.

Nesychronní síťový čas v protokolu

Obecně jsou Millsovy unixové hodiny implementovány se schopností ignorovat přestupné sekundy. Unixový čas se automaticky sníží tam, kde se objevila pozitivní přestupná sekunda a zvýší tam, kde se objevila negativní. Toto podle Millse usnadňuje implementaci.

Nesynchronní Millsovy Unixové hodiny při vložení přechodné sekundy.
TAI (1 January 1999) UTC (31 December 1998 to 1 January 1999) state Unix clock
1999-01-01T00:00:29.75 1998-12-31T23:59:58.75 TIME_INS 915 148 798.75
1999-01-01T00:00:30.00 1998-12-31T23:59:59.00 TIME_INS 915 148 799.00
1999-01-01T00:00:30.25 1998-12-31T23:59:59.25 TIME_INS 915 148 799.25
1999-01-01T00:00:30.50 1998-12-31T23:59:59.50 TIME_INS 915 148 799.50
1999-01-01T00:00:30.75 1998-12-31T23:59:59.75 TIME_INS 915 148 799.75
1999-01-01T00:00:31.00 1998-12-31T23:59:60.00 TIME_INS 915 148 800.00
1999-01-01T00:00:31.25 1998-12-31T23:59:60.25 TIME_OOP 915 148 799.25
1999-01-01T00:00:31.50 1998-12-31T23:59:60.50 TIME_OOP 915 148 799.50
1999-01-01T00:00:31.75 1998-12-31T23:59:60.75 TIME_OOP 915 148 799.75
1999-01-01T00:00:32.00 1999-01-01T00:00:00.00 TIME_OOP 915 148 800.00
1999-01-01T00:00:32.25 1999-01-01T00:00:00.25 TIME_WAIT 915 148 800.25
1999-01-01T00:00:32.50 1999-01-01T00:00:00.50 TIME_WAIT 915 148 800.50
1999-01-01T00:00:32.75 1999-01-01T00:00:00.75 TIME_WAIT 915 148 800.75
1999-01-01T00:00:33.00 1999-01-01T00:00:01.00 TIME_WAIT 915 148 801.00
1999-01-01T00:00:33.25 1999-01-01T00:00:01.25 TIME_WAIT 915 148 801.25

Pokud se zaměříme na stavovou proměnnou, která jednoznačně indikuje v jakém stavu je .

Možnosti hodnot neznámé leap second state jsou:
 *   TIME_OK:  normální, žádná přechodná sekunda v dohledu
 *   TIME_INS:  přechodná sekunda bude vložena na konci tohoto dne ( případě negativní přechodné sekundy )
 *   TIME_DEL: přechodná sekunda bude vymazána na konci tohoto dne ( případě pozitivní přechodné sekundy )
 *   TIME_OOP: tato sekunda je přechodná, přechodná sekunda se vkládá
 *   TIME_WAIT: přechodná sekunda se objevila v nedávné minulosti

zdroj [1]

Metoda založená na Mezinárodním atomovém čase (TAI)

Další, mnohem méně vídanou vyriantou sledování Unixového času je ta, která používá jako základ výpočtu TAI. Některé linuxové systémy mohou být nakonfigurovány takto. Je to proto, že každý TAI den má přesně 86400 sekund a neexistují zde přechodné vteřiny, proto se jedná o čistě lineární součet sekund od 1970-01-01T00:00:00 TAI. To dělá počty s časovými úseky mnohem jednodušší. Hodnoty v tomto systému nevykazují nejednoznačnosti, s jakými se u striktně POSIX a NTP systémů setkáváme.

V případě nutnosti konverze tohoto pseudo-Unixového do UTC času ale budeme opět potřebovat tabulku přechodných sekund. To je podobné způsobu, jako když chceme převádět Unixový čas do místního času – je nutné zohlednit časová pásma. Databáze IANA obsahuje informace o přechodných sekundách. Organizace IANA také uvolňuje kód umožnující převody mezi TAI časovými otisky a lokálními časy. Problematické jsou akorát převody času před 1.1.1970, kdy Unixový čas nabývá záporných hodnot (popsáno níže).

TAI je na první pohled podobný Unixovému času, ale není totožný. TAI definuje vteřinu jinak než POSIX, na kterém je Unixový čas založen. TAI definuje sekundu jako čas, který je potřeba k oscilaci atomu Cesia 133 k vykonání 9 192 631 770 oscilací (zdroj [2]). Tato metoda využívaná v atomových hodinách je charakterizována velmi minimálními odchylkami, kdežto zemská rotace, na které je založeno UTC a POSIX, tím pádem i Unixový čas, má odchylky daleko výraznější.

Číselná reprezentace

Číselná reprezentace Unixového času může nabývat mnoha podob, které umožňují vyjádřit číslo. Někdy to mohou být jednoduché číslice v textovém poli (string), jejihž zpracování je provázeno zanedbatelnými problémy. Velmi obvyklá je ale binární reprezentace těchto hodnot.

Standard Unix time_t(údaj reprezentující konkrétní okamžik) se ukládá jako integer – tradičně 32 bitový. 32 bitů dokáže popsat čas v rozmezí 136 let. Počáteční čas, který může být takto vyjádřen je 13.12.1901 a konečný je 19.1.2038. V sekundě po 03:14:07 UTC 2038-01-19 dojde k přetečení proměnné. Tento problém má název Problém roku 2038.

V některých novějších operačních systémech je time_t rozšířen na 64 bitů. To už stačí k pokrytí časového rozpětí od vzniku vesmíru po přibližně rok 293 biliónů.

Původní rozepře, zda by time_t měl být podepsaný nebo nepodepsaný integer (pokud je nepodepsaný, první bit také vyjadřuje hodnotu, ale pak má integer pouze kladné hodnoty) byla vyřešena v prospěch podepsaného integeru, což umožňuje vyjadřovat hodnoty před rokem 1970. Softwarová vývojářská patforma pro verzi 6 QNX opračního systému pracuje s nepodepsaným 32-bitovým integerem, což odsouvá problém přetečení o 68 let, nicméně, jak již zmíněno, je nemožné vyjádřit čas před rokem 1970 .

Apecifikace POSIX a Open Group Unix zahrnují standardní knihovnu C, která zahrnuje časové typy a funkce definované v hlavičkovém souboru <time.h>. ISO C standardu nařizuje, že time_t musí být aritmetického typu, ale žádná další specifika.

UTC základ

Současná verze UTC s přechodnými sekundami je definována až po 1.1.1972. Předtím, po 1.1.1961 existovala starší verze UTC, která trpěla mnoha nedostatky – užívala například jiné, než SI sekundy. Před rokem 1961 nebyl standardizován světový čas a před rokem 1958 standardně neexistovalo měření času atomovými hodinami. Čas se určoval na základě aproximace výpočtů zemské rotace.

Přesná definice Unixového času je jako derivátu času UTC je formálně v pořádku pouze pokud bereme v potaz současnou formu UTC. Naštěstí je fakt, že Unixová epocha předchází vzniku současné podoby UTC neovlivňuje funkcionalitu v současné době. Počet dnů od 1.1.1970 (Unixová epocha) do 1.1.1972 (vznik současné podoby UTC) je známý, a to je jediné, co je důležité pro Unixový čas.

Význam časových hodnot menších než +63 072 000 (před 1.1.1972) není přesně definován, ale přibližně se dají spočítat podle GMT. Počítače v té době měly zřídka hodiny schopné rozlišovat čas s přesností větší, než 1 sekunda. Unixový čas se tedy nehodí pro reprezentaci momentů před rokem 1972 s požadovanou přesností větší než 1 sekunda.

Od roku 2009 se zvažuje ustoupení od zohledňování přestupných sekund v civilním čase. Tak by vzniklo nové časové měřítko - Mezinárodní čas, který by odpovídal UTC, ale po svém zavedení by nepočítal přechodné sekundy, takže by udržoval konstantní předstih, v řádu desítek sekund před časem TAI. Pokud se tento nová Mezinárodní čas zavede, je pravděpodobné, že se Unixový čas bude určovat právě na jeho základě, namísto na základě UTC.

Historie

První veze Unixového času byl 32 bitový integer, který narůstal o jednu jednotku s frekvencí 60 Hz, což byl čas systémových hodin. Hodnota 60 Hz se v některých rozhraní stále objevuje. Epocha také zaznamenala změny. V prvním vydání "Unix Programmer's Manual" byla Epocha datována na 1.1.1971, měřeno v šedesátinách sekundy. V 32 bitové reprezentaci však nebylo možné měřit čas v šedesátinách sekundy - k přetečení by došlo již za 2,5 roku. Proto bylo upraveno tempo přírůstku hodnot time_t i samotná Epocha byla přesunuta na současně užívané datum. To umožňuje 32 bitovému podepsanému integeru popsat asi 136 let.

Jak již bylo zmíněno výše, Unixový čas byl původně zamýšlen jako jednoduchá lineární reprezentace času, uplynulá od Epochy. Nicméně ze začátku nikdo nemyslel na detaily měření a členění času. Předpokládalo se, že bude existovat nějaké existující lineární časové měřítko, které by se dalo využít. První verze manuálu Unixu však ani nespecifikovala, jaké časové pásmo se bude považovat za výchozí. Během doby se Unixový čas setkal s problémy, které vycházely z jeho postupné specifikace.

Když byl napsán POSIX.1, jak bude time_t přesně nakládat s přestupnými sekundami. Výbor POSIXu zvažoval, zda zachovat Unixový čas lineární, jak bylo původně zamýšleno na úkor náročnosti převodu na civilní čas a z civilního času.

Výbor POSIXU byl přesvědčen argumenty proti složitosti ve funkcích knihovny a striktně definoval Unixový čas na základě čase UTC. Naneštěstí byla tato definice tak strohá, že ani nezahrnovala kompletní pravidlo přechodných let v gregoriánském kalendáři.

POSIX.1 z roku 2001 napravila chybu ohledně přechodných let v Unixovém čase, ale ponechala definici pro výpočet času na základě UTC. Od 90 let již byly počítače nastaveny s dostatečnou přesností na to, aby mělo smysl rozlišovat podle jakého časového měřítka běží systémový čas. Většin počítačů tak byla nakonfigurována na Unixový čas založený na UTC. To znamenalo výrazné navýšení komplexity v implementaci Unixových systémů a síťových protokolů v možnostech vykonávání akcí v případě zaznamenání přestupné sekundy.

V tomto článku byl použit překlad textu z článku Unix time na anglické Wikipedii.