Proč má Unix svůj vlastní koncept času? Co je to epocha a jaký je problém Y2038?

Unixový čas je prostředek představující konkrétní datum a čas používaný systémy Linux, macOS a mnoha dalšími interoperabilními systémy. Je tak rozšířený, že ho pravděpodobně používáte, aniž byste si toho byli vědomi. Jakmile však pochopíte unixový čas, všimnete si ho v mnoha kontextech. Několik nástrojů vám může pomoci pracovat s Unixovým časem.

Jaký je účel unixového času?

Unixový čas je počet celkových sekund od stanoveného času a data. Jedná se o formát data / času (nebo časového razítka), který vypadá jinak než lidsky čitelná data a časy, na které jsme zvyklí. Je to čistě z důvodů efektivity. Uložení jediného čísla představujícího sekundy zabere mnohem méně místa než uložení samostatných hodnot pro rok, měsíc, hodinu atd.

Samozřejmě, moderně řečeno, prostorový rozdíl vůbec není tak velký. Ale vezměte v úvahu, že Unix vznikl koncem šedesátých let, kdy bylo dostupné úložiště mnohem menší. Hodně se také používají časová razítka, takže se jejich úložiště sčítá. Například ke každému souboru jsou přidružena tři časová razítka.

Formát je téměř nemožné přeložit do hlavy, pokud nejste matematický génius. Ale stále má některé výhody oproti čitelnějším alternativám, jako je St, 21. října 2015, 07:28:00 GMT. Na první pohled si můžete velmi snadno objednat dvě časová razítka Unixu. Obvykle je také rychlejší zjistit rozdíl mezi dvěma časovými razítky. To platí zejména pro data blízko sebe, například v sousedních dnech.

O epochě

Unixový čas je tedy celkový počet sekund od konkrétního časového bodu. Ale jaký je ten okamžik? Své 00:00:00 UTC na 1. ledna 1970. Toto se často označuje jako Unix Epoch. Programátoři zvolili toto datum pro epochu z pohodlí, protože to bylo nejbližší kulaté datum, kdy vynalezli Unixový čas.

Možná jste toto datum viděli, když se něco pokazilo. Je to zjevně chyba, ale ta, která vypadá velmi divně, když vyústí v rande z doby před narozením mnoha z nás! Je to zcela pochopitelné, když víte o unixovém čase. Pokud se jakýkoli systém pokouší zobrazit časové razítko, které nemá žádnou hodnotu, bude se často překládat k 0 a bude mít za následek přesné datum epochy.

Unixový formát časových dat

Přesně řečeno, žádný neexistuje. Původním datovým typem bylo 32bitové celé číslo, což často zůstává, a to i v mnohem výkonnějších systémech.

Tento datový typ umožňuje hodnotě uložit celkem 2 ^ 32 sekund, což je něco přes 136 let. Tato hodnota je obvykle podepsaná, což znamená, že může být záporná nebo kladná. Obvykle to tedy představuje 68 let na obou stranách epochy, tj. 1902-2038.

Stále je to samozřejmě omezené období. Primární použití formátu časového razítka však bylo pro koncepty, jako je úprava souboru. Bylo velmi potřeba představovat čas blízký současnosti, spíše než dávnou historii nebo daleko do budoucnosti. Dokonce i pro aplikace, jako jsou kalendáře, je jen zřídka potřeba představovat data více než několik desítek let do budoucnosti.

To ale neznamená, že toto omezené časové rozpětí je bez problémů...

Problém roku 2038

Chyba Y2K (jedna z nejhorších programovacích chyb v historii) ovlivnily počítačové systémy, které ukládaly roky jako dvouciferné hodnoty. Když přišel rok 2000, takové systémy s ním zacházely, jako by to bylo v roce 1900. V takovém případě to nebylo tak katastrofické, jak se obávalo, hlavně proto, že mnoho lidí předem připravilo spoustu času a úsilí.

10 nejhorších programovacích chyb v historii

V jeho legendární minulosti kódovalo také ničení. Instance trochu špatného kódu způsobily katastrofu na hlavní úrovni. Následuje 10 nejhorších programovacích chyb v historii.

Pokud jste věnovali pozornost v předchozí části, možná jste si všimli podobného problému, který by mohl ovlivnit čas Unixu. Unixový čas má vlastní problém s daty: problém Y2k38. (Často se o něm mluví jako o problému, nikoli o chybě; možná jsme se stali optimističtějšími od roku 2000!) Když čas Unixu doslova vyprší v roce 2038, budou systémy považovat nová data buď za 1902 nebo 1970. Nebo možná úplně selžou.

Alespoň nás tento problém nezasáhne úderem půlnoci na Silvestra. Poslední vteřina 32bitového Unixového času připadne na 19. března. V konečném důsledku pravděpodobně upgradujeme většinu systémů do roku 2038, jinak budou zastaralé.

Některé užitečné zdroje časových značek

The Převaděč epochy Web je pravděpodobně nejkomplexnějším dostupným převodníkem časových značek. Začíná to zobrazením aktuálního času Unixu - v reálném čase - a navíc k tomu přidává téměř všechny představitelné funkce. Jeho hlavní použití je pro převod mezi časovými značkami a daty čitelnými člověkem v obou směrech.

Dan's Tools je obrovská sbírka užitečných webových aplikací, z nichž jedna je převodník časových značek. Je to základní, ale má velmi čistou prezentaci a snadno se používá.

Time.is představuje další, ještě minimalističtější vzhled. Zobrazuje čas v mnoha formátech, včetně času Unixu. To zahrnuje aktuální čas v názvu stránky, což je užitečné.

V systémech Linux a MacOS datum program je základní utilita pro práci s datem / časem, včetně časových razítek Unixu. Volá se bez argumentů a vrací aktuální datum a čas ve formátu čitelném pro člověka:

$ datum
St 10. února 12:28:30 GMT 2021

Pokud potřebujete aktuální datum a čas v Unixovém čase, použijte +% s argument:

$ date +% s
1612960114

Z data čitelného člověkem můžete převést na časové razítko pomocí -d vlajka, pokud vaše verze datum podporuje to. Většina verzí systému Linux by měla ve výchozím nastavení:

$ date -d "2. ledna 1970" +% s
82800

V systému macOS datum je jiný program, který vyžaduje jinou sadu příznaků:

$ date -j -f "% b% d% Y% T" "2. ledna 1970 00:00:00" "+% s"
82800

V opačném směru můžete převádět z časové značky Unixu pomocí -r vlajka:

$ datum -r 1600000000
Ne 13. září 2020 13:26:40 BST

Některé další programy používají % s formát pro práci s Unixovým časem. Například pokud chcete zobrazit datum úpravy souboru v Unixovém čase, pomocí Linuxová verze je, můžete použít následující:

$ ls -l --time-style = +% s index.tmp.html
-rw-r - r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html

Jak používat Unixový čas v programovacích jazycích

PHP má čas() funkce, která vrací aktuální časové razítko Unixu. Své datum() funkce vezme časové razítko jako svůj druhý argument:

$ php -r 'echo date ("Y-m-d", time ());'
2021-02-11

JavaScript přistupuje k věcem zajímavým způsobem. Má to Date.now () metoda pro získání počtu milisekund od epochy Unixu. Samozřejmě to můžete rozdělit na 1 000 a zaokrouhlit výsledek tak, aby poskytoval ekvivalentní Unixový čas v sekundách:

> Math.floor (Date.now () / 1000)
1613083012

Pochopení Unix Time

Unix time je jednoduchý koncept, který se objevuje na mnoha místech. Jakmile tomu porozumíte, může se vám zdát docela užitečné, například při výpočtu časových rozdílů. Můžete také rozpoznat, kdy to může být příčinou určitých chyb.

Pojmy jako epocha a časová razítka jsou důležitou součástí začátku používání Linuxu. Chcete-li se dozvědět více o základech, jako je je, podívejte se na našeho průvodce základními příkazy Linuxu.

E-mailem
9 základních příkazů, které vám pomohou začít s Linuxem

Chcete se seznámit s Linuxem? Začněte s těmito základními příkazy systému Linux, abyste se naučili standardní výpočetní úlohy.

Související témata
  • Nespecifikováno
O autorovi
Bobby Jack (Publikováno 27 článků)

Bobby je technologický nadšenec, který většinu softwarových vývojářů pracoval téměř dvě desetiletí. Je vášnivým hráčem, pracuje jako editor recenzí v časopisu Switch Player Magazine a je ponořen do všech aspektů online publikování a vývoje webových stránek.

Více od Bobbyho Jacka

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji s technickými tipy, recenzemi, bezplatnými elektronickými knihami a exkluzivními nabídkami!

Ještě jeden krok…!

V e-mailu, který jsme vám právě poslali, potvrďte svou e-mailovou adresu.

.