Převodník Unixového časového razítka
Převedený datum a čas
Převod Unixového Časového Razítka
Úvod
Unixové časové razítko (také známé jako POSIX čas nebo Epoch čas) je systém pro popis okamžiku v čase. Je to počet sekund, které uplynuly od 1. ledna 1970 (půlnoc UTC/GMT), bez započítání přestupných sekund. Unixová časová razítka jsou široce používána v počítačových systémech a programovacích jazycích, protože poskytují kompaktní, jazykově nezávislé zastoupení konkrétního okamžiku v čase.
Tento převodník vám umožňuje převést Unixové časové razítko na datum a čas ve formátu, který je snadno čitelný pro lidi. Podporuje jak 12hodinový (AM/PM), tak 24hodinový časový formát, aby vyhovoval různým regionálním a osobním preferencím.
Jak fungují Unixová časová razítka
Unixová časová razítka se počítají jako počet sekund od Unixové Epochy (1. ledna 1970, 00:00:00 UTC). To je činí obzvlášť užitečnými pro výpočty časových rozdílů a pro ukládání dat v kompaktním formátu.
Matematický převod z Unixového časového razítka na kalendářní datum zahrnuje několik kroků:
- Začněte s Unixovou Epochou (1. ledna 1970, 00:00:00 UTC)
- Přidejte počet sekund v časovém razítku
- Zohledněte přestupné roky, různé délky měsíců a další složitosti kalendáře
- Aplikujte úpravy časového pásma, pokud je to potřeba
Například Unixové časové razítko 1609459200
představuje pátek, 1. ledna 2021, 00:00:00 UTC.
Převodní vzorec lze vyjádřit jako:
Většina programovacích jazyků a operačních systémů poskytuje vestavěné funkce pro zpracování tohoto převodu, což abstrahuje složité kalendářní výpočty.
Možnosti formátu času
Tento převodník nabízí dvě možnosti formátu času:
-
24hodinový formát (někdy nazývaný "vojenský čas"): Hodiny se pohybují od 0 do 23 a neexistuje žádná označení AM/PM. Například 15:00 je reprezentováno jako 15:00.
-
12hodinový formát: Hodiny se pohybují od 1 do 12, s AM (ante meridiem) pro časy od půlnoci do poledne a PM (post meridiem) pro časy od poledne do půlnoci. Například 15:00 ve 24hodinovém formátu je reprezentováno jako 3:00 PM.
Volba mezi těmito formáty je většinou otázkou regionální konvence a osobních preferencí:
- 24hodinový formát se běžně používá ve většině Evropy, Latinské Ameriky a Asie, stejně jako v vědeckých, vojenských a lékařských kontextech po celém světě.
- 12hodinový formát je rozšířený v USA, Kanadě, Austrálii a některých dalších anglicky mluvících zemích pro každodenní použití.
Hraniční případy a omezení
Při práci s Unixovými časovými razítky je důležité být si vědom několika hraničních případů a omezení:
-
Negativní časová razítka: Tato představují data před Unixovou Epochou (1. ledna 1970). Ačkoli jsou matematicky platná, některé systémy nemusí správně zpracovávat negativní časová razítka.
-
Problém roku 2038: Unixová časová razítka jsou často ukládána jako 32bitová podepsaná celá čísla, která přetečou 19. ledna 2038. Po tomto datu nebudou 32bitové systémy schopny správně reprezentovat časy, pokud nebudou upraveny tak, aby používaly větší typ celého čísla.
-
Extrémně velká časová razítka: Velmi vzdálené budoucí daty nemusí být reprezentovatelná v některých systémech nebo mohou být zpracovávána nekonzistentně.
-
Přestupné sekundy: Unixový čas nezohledňuje přestupné sekundy, které jsou občas přidávány do UTC, aby kompenzovaly nepravidelnou rotaci Země. To znamená, že Unixový čas není přesně synchronizován s astronomickým časem.
-
Zohlednění časového pásma: Unixová časová razítka představují okamžiky v UTC. Převod na místní čas vyžaduje další informace o časovém pásmu.
-
Letní čas: Při převodu časových razítek na místní čas je třeba zohlednit složitosti přechodů na letní čas.
Případy použití
Unixová časová razítka se používají v mnoha aplikacích v oblasti výpočetní techniky a správy dat:
-
Záznamy databáze: Časová razítka se běžně používají k zaznamenání, kdy byly položky vytvořeny nebo upraveny.
-
Webový vývoj: HTTP hlavičky, cookies a mechanismy ukládání do mezipaměti často používají Unixová časová razítka.
-
Logovací soubory: Systémové logy obvykle zaznamenávají události s Unixovými časovými razítky pro přesné chronologické pořadí.
-
Systémy správy verzí: Git a další VCS používají časová razítka k zaznamenání, kdy byly provedeny commity.
-
Odpovědi API: Mnoho webových API zahrnuje časová razítka ve svých odpovědích, aby naznačila, kdy byla data vygenerována nebo kdy byly zdroje naposledy upraveny.
-
Souborové systémy: Časy vytvoření a úpravy souborů jsou často ukládány jako Unixová časová razítka.
-
Správa relací: Webové aplikace používají časová razítka k určení, kdy by měly vypršet uživatelské relace.
-
Analýza dat: Časová razítka poskytují standardizovaný způsob práce s časovými daty v analytických aplikacích.
Alternativy
Ačkoli jsou Unixová časová razítka široce používána, existují alternativní formáty reprezentace času, které mohou být v určitých kontextech vhodnější:
-
ISO 8601: Standardizovaný řetězcový formát (např. "2021-01-01T00:00:00Z"), který je čitelný pro lidi a zároveň udržuje třídění. Často se preferuje pro výměnu dat a uživatelské aplikace.
-
RFC 3339: Profil ISO 8601 používaný v internetových protokolech, s přísnějšími požadavky na formátování.
-
Čitelné formáty pro lidi: Lokalizované datové řetězce (např. "1. ledna 2021") jsou vhodnější pro přímou interakci s uživateli, ale jsou méně vhodné pro výpočty.
-
Microsoft FILETIME: 64bitová hodnota představující počet intervalů 100 nanosekund od 1. ledna 1601, používaná v systémech Windows.
-
Julian Day Number: Používá se v astronomii a některých vědeckých aplikacích, počítající dny od 1. ledna 4713 př. n. l.
Volba formátu času závisí na faktorech, jako jsou:
- Požadovaná přesnost
- Potřeby čitelnosti pro lidi
- Omezující faktory pro ukládání
- Kompatibilita se stávajícími systémy
- Rozsah dat, která je třeba reprezentovat
Historie
Koncept Unixového času vznikl s vývojem operačního systému Unix v Bell Labs na konci 60. a začátku 70. let. Rozhodnutí použít 1. ledna 1970 jako epochu bylo poněkud arbitrární, ale praktické pro tu dobu – bylo to dost nedávné, aby se minimalizovaly požadavky na ukládání pro data, která byla zajímavá, ale dost daleko v minulosti, aby byla užitečná pro historická data.
Původní implementace používala 32bitové podepsané celé číslo pro ukládání počtu sekund, což bylo dostatečné pro očekávanou životnost Unixových systémů v té době. Toto rozhodnutí však vedlo k Problému roku 2038 (někdy nazývanému "Y2K38" nebo "Unix Millennium Bug"), protože 32bitová podepsaná celá čísla mohou reprezentovat pouze data do 19. ledna 2038 (03:14:07 UTC).
Jak Unix a Unix-like operační systémy získaly popularitu, Unixové časové razítko se stalo de facto standardem pro reprezentaci času v počítačích. Bylo přijato mnoha programovacími jazyky, databázemi a aplikacemi, což rozšířilo jeho použití daleko za původní prostředí Unix.
Moderní systémy stále častěji používají 64bitová celá čísla pro časová razítka, což prodlužuje reprezentovatelný rozsah na přibližně 292 miliard let v obou směrech od epochy, což efektivně řeší Problém roku 2038. Nicméně, starší systémy a aplikace mohou být stále zranitelné.
Jednoduchost a užitečnost Unixového časového razítka zajistily jeho pokračující relevanci navzdory vývoji sofistikovanějších formátů reprezentace času. Zůstává základním konceptem v oblasti výpočetní techniky, který tvoří základní kámen naší digitální infrastruktury.
Příklady kódu
Zde jsou příklady, jak převést Unixová časová razítka na snadno čitelná data v různých programovacích jazycích:
// JavaScript převod časového razítka
function convertUnixTimestamp(timestamp, use12Hour = false) {
// Vytvořte nový objekt Date (JavaScript používá milisekundy)
const date = new Date(timestamp * 1000);
// Možnosti formátování
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
// Převést na řetězec pomocí formátování podle lokality
return date.toLocaleString(undefined, options);
}
// Příklad použití
const timestamp = 1609459200; // 1. ledna 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24hodinový formát
console.log(convertUnixTimestamp(timestamp, true)); // 12hodinový formát
Řešení hraničních případů
Při práci s Unixovými časovými razítky je důležité správně zpracovávat hraniční případy. Zde jsou příklady zpracování některých běžných hraničních případů:
// JavaScript zpracování hraničních případů
function safeConvertTimestamp(timestamp, use12Hour = false) {
// Zkontrolovat, zda je časové razítko platné
if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
return "Neplatné časové razítko";
}
// Zkontrolovat negativní časová razítka (data před 1970)
if (timestamp < 0) {
// Některé prohlížeče nemusí správně zpracovávat negativní časová razítka
// Použijte robustnější přístup pro data před 1970
const date = new Date(timestamp * 1000);
if (isNaN(date.getTime())) {
return "Neplatné datum (před 1970)";
}
}
// Zkontrolovat problém Y2K38 (pro 32bitové systémy)
const maxInt32 = 2147483647; // Maximální hodnota pro 32bitové podepsané celé číslo
if (timestamp > maxInt32) {
// Zvažte použití BigInt pro velmi velká časová razítka v moderním JavaScriptu
console.warn("Časové razítko překračuje limit 32bitového celého čísla (problém Y2K38)");
}
// Pokračovat s normálním převodem
try {
const date = new Date(timestamp * 1000);
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
return date.toLocaleString(undefined, options);
} catch (error) {
return "Chyba při převodu časového razítka: " + error.message;
}
}
Odkazy
-
"Unix Time." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time
-
"Problém roku 2038." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem
-
Olson, Arthur David. "Složitosti kalendářního času." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf
-
"ISO 8601." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/ISO_8601
-
"RFC 3339: Datum a čas na internetu: Časová razítka." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339
-
Kernighan, Brian W., a Dennis M. Ritchie. "Programovací jazyk C." Prentice Hall, 1988.