Unix vremenske oznake i Epoch vrijeme: Problem godine 2038, objašnjeno

Objavljeno: 9:00 AM , od Uredništvo VrijemeU.com

Objašnjenje Unix vremenskih oznaka: sekunde od epohe 1970., UTC pretvorba, preljev godine 2038. u 03:14:07 UTC, 64-bitno rješenje i prijestupne sekunde.

Digitalni sat koji se prebacuje s 03:14:07 UTC 19. siječnja 2038., ilustrirajući preljev 32-bitnog Unix vremena

Što je Unix vremenska oznaka?

Unix vremenska oznaka je jedan broj: broj sekundi koje su protekle od Unix epohe, definirane kao 00:00:00 UTC 1. siječnja 1970. To je sve. Bez vremenske zone, bez niza datuma, bez naziva mjeseci — samo cijeli broj koji se povećava za jednu jedinicu svake sekunde.

Budući da je epoha fiksna i univerzalna, vremenska oznaka poput 1700000000 znači isti trenutak bilo gdje na Zemlji. Poslužitelj u Tokiju i prijenosnik u Chicagu složit će se da se odnosi na 14. studenog 2023. u 22:13:20 UTC. Lokalni prikaz razlikuje se po vremenskoj zoni, ali osnovni broj se nikada ne mijenja.

Jedno namjerno pojednostavljenje: Unix vrijeme ignorira prijestupne sekunde. Pretpostavlja da svaki dan traje točno 86.400 sekundi, što nije sasvim točno u astronomskoj stvarnosti, ali održava aritmetiku čistom. Više o tome u nastavku.

Zašto ih inženjeri vole

Vremenske oznake su posvuda u softveru — vremena izmjene datoteka, zapisi u bazama podataka, odgovori API-ja, polja isteka JWT-a, retci zapisnika — i to s dobrim razlogom:

  • One su jedna vrijednost. Jedan cijeli broj pohranjuje puni datum i vrijeme. Bez parsiranja, bez nejasnoća oko MM/DD naspram DD/MM.
  • One su neovisne o vremenskoj zoni. Broj je uvijek UTC. Pretvarate u lokalno vrijeme samo kada ga prikazujete čovjeku.
  • Lako se uspoređuju i sortiraju. Koji se događaj dogodio prvi? Manji cijeli broj. Trajanje između dva događaja? Oduzmite ih; odgovor je u sekundama.
  • Kompaktno se pohranjuju. Jedan 4- ili 8-bajtni cijeli broj naspram formatiranog niza.

Zbog toga toliko infrastrukture u pozadini govori u epohalnim sekundama, čak i kada vam sučelje prikazuje prijateljski 2026-07-23. Ako želite prelaziti između ova dva prikaza, pretvarač Unix vremenske oznake obavlja prijevod u oba smjera.

Čitanje jedne: Primjer s radom

Uzmimo vremensku oznaku 1000000000 — poznatu, jer se prelila uživo na televiziji među Unix entuzijastima.

Da biste je ručno pročitali, dijelite sekunde na veće jedinice. Otprilike, 1.000.000.000 sekundi je oko 31,7 godina (godina ima ~31.556.952 sekundi). Dodajte to epohi iz 1970. i stižete u 2001. Točan trenutak je 09. rujna 2001., 01:46:40 UTC.

Ovu aritmetiku rijetko radite ručno — svaki jezik ima ugrađenu funkciju. U Pythonu:

```python from datetime import datetime, timezone datetime.fromtimestamp(1000000000, tz=timezone.utc)

2001-09-09 01:46:40+00:00

```

Ključna poanta: pretvorba je uvijek usidrena na UTC. Funkcija pretvara sirovi broj sekundi u kalendarski datum hodajući unaprijed od epohe. Ako umjesto toga želite lokalno vrijeme, primjenjujete pomak vremenske zone nakon UTC pretvorbe — sama vremenska oznaka ne nosi informaciju o zoni.

Problem godine 2038.

Ovdje priča postaje zanimljiva — i gdje mnogi inače dobro izgrađeni sustavi imaju otkucavajući sat u sebi.

Desetljećima je standardni C tip koji se koristi za pohranu Unix vremena, time_t, bio uobičajeno 32-bitni cijeli broj s predznakom. 32-bitni cijeli broj s predznakom može predstavljati vrijednosti od −2.147.483.648 do 2.147.483.647. Ta gornja granica je problem.

Brojeći sekunde od epohe 1970., vrijednost 2.147.483.647 doseže se u 03:14:07 UTC 19. siječnja 2038. Jednu sekundu kasnije, brojač bi trebao postati 2.147.483.648 — ali taj broj ne stane u 32-bitni cijeli broj s predznakom. Umjesto da nastavi prema gore, bitovi se prelijevaju i vraćaju na najnegativniju vrijednost, −2.147.483.648.

Negativna vremenska oznaka tumači se kao vrijeme prije epohe. Dakle, sat ne samo da staje — on skače unatrag na 13. prosinca 1901. Svaki sustav koji je vjerovao svom 32-bitnom time_t odjednom vjeruje da je rano dvadeseto stoljeće.

Ovo se često naziva Y2K38 bug ili Unix milenijski bug, i strukturno je ista vrsta prelijevanja fiksne širine koja je pokrenula paniku oko godine 2000. — samo dalje u budućnosti i ukorijenjena u granicama binarnih cijelih brojeva umjesto dvoznamenkastih godina.

Gdje zapravo grize

Moderni 64-bitni stolni računali i poslužitelji uglavnom su popravljeni prije godina. Rizik je koncentriran na mjestima koja je teško ažurirati:

  • Ugrađeni i industrijski sustavi. Usmjerivači, kontroleri, medicinski uređaji, automobilske ECU jedinice i IoT hardver koji je isporučen s 32-bitnim time_t i može raditi netaknut 20+ godina. Mnogi uređaji koji se danas postavljaju i dalje će biti u upotrebi 2038. godine.
  • Naslijeđeni C kod. Aplikacije prevedene uz staru definiciju time_t, posebno tamo gdje je tip ušao u formate na disku ili mrežne protokole.
  • Stare baze podataka i datotečni sustavi. Formati pohrane koji su pakirali vremenske oznake u 32-bitna polja. Neki stariji sustavi već pokazuju simptome pri rukovanju datumima u dalekoj budućnosti — pomislite na 20-godišnju hipoteku ili istek certifikata koji doseže nakon 2038.

Način kvara nije uvijek dramatičan pad. Ponekad je to suptilno pogrešno izračunat datum: istekao token koji se čita kao važeći, redoslijed sortiranja koji se invertira, zakazani zadatak koji se pokreće 1901. godine.

Popravak: 64-bitno vrijeme

Lijek je načelno jednostavan — proširiti time_t na 64 bita. 64-bitni cijeli broj s predznakom može brojati sekunde daleko izvan bilo kojeg praktičnog horizonta: točka prelijevanja je otprilike 292 milijarde godina u budućnosti, udobno izvan očekivanog životnog vijeka Sunca.

Većina trenutnih operativnih sustava već je napravila ovaj potez. 64-bitni Linux koristi 64-bitni time_t; čak je i 32-bitni Linux dobio podršku za 64-bitno vrijeme u jezgri i glibcu posljednjih godina. Teži dio nije sam popravak — to je pronalaženje i ponovno sastavljanje svakog posljednjeg djela firmvera, svakog pohranjenog formata i svake trećestranačke binarne datoteke koja još uvijek pretpostavlja 32 bita. Taj revizijski posao je pravi projekt 2038.

Kako se prijestupne sekunde uklapaju

Astronomsko vrijeme i atomsko vrijeme lagano odstupaju, pa službeni UTC povremeno ubacuje prijestupnu sekundu kako bi satovi ostali usklađeni sa Zemljinom rotacijom. Unix vrijeme, po dizajnu, pretvara se da one ne postoje — ono tvrdo kodira 86.400 sekundi po danu.

Kada se dogodi prijestupna sekunda, sustavi je obično "razmazuju" — raspoređujući dodatnu sekundu kroz vremenski prozor (Google je popularizirao 24-satno razmazivanje) tako da nijedan sat nikada ne mora pokazati nemoguće 23:59:60. Rezultat: Unix vremenske oznake ostaju glatke i monotone, po cijenu da su sićušni djelić sekunde odmaknute od strogog UTC-a tijekom razmazivanja. Za praktički sav softver ovo je upravo kompromis koji želite. Prelijevanje 2038. je problem širine cijelog broja; prijestupne sekunde su zasebna, mnogo manja definicijska osobitost — nemojte ih miješati.

Ključni zaključci

  • Unix vremenska oznaka su sekunde od 00:00:00 UTC 1. siječnja 1970., ignorirajući prijestupne sekunde.
  • To je jedan, o vremenskoj zoni neovisan cijeli broj — lako ga je pohraniti, usporediti i sortirati.
  • Pretvorba je uvijek relativna prema UTC-u; lokalno vrijeme se primjenjuje naknadno.
  • 32-bitni time_t s predznakom prelijeva se u 03:14:07 UTC 19. siječnja 2038., vraćajući se na negativnu vrijednost i skačući u 1901.
  • Popravak je 64-bitni time_t; napor je revizija ugrađenih i naslijeđenih sustava.

Želite li to vidjeti na djelu? Zalijepite bilo koju epohalnu vrijednost u pretvarač Unix vremenske oznake da biste je pročitali kao ljudski datum — ili idite obrnutim putem i pretvorite datum u njegovu vremensku oznaku.

Često postavljana pitanja

Je li Unix vremenska oznaka u sekundama ili milisekundama?

Klasično Unix vrijeme je u sekundama. Međutim, JavaScript i mnoga web sučelja koriste milisekunde od epohe, pa je vrijednost poput 1700000000000 1.000× veća. Brzi znak: vremenska oznaka u sekundama za nedavni datum ima 10 znamenki; ona u milisekundama ima 13. Kada ste u nedoumici, provjerite veličinu prije pretvorbe.

Hoće li problem godine 2038. srušiti moj telefon ili prijenosnik?

Gotovo sigurno ne. Moderni 64-bitni operativni sustavi već koriste 64-bitni time_t, koji pomiče prelijevanje milijardama godina u budućnost. Stvarna izloženost je u dugovječnim ugrađenim uređajima i starom softveru koji se još uvijek oslanja na 32-bitno vrijeme i možda neće biti ažuriran prije 2038.

Može li Unix vremenska oznaka biti negativna?

Da. Negativne vrijednosti predstavljaju trenutke prije epohe 1970. — na primjer, -1 je 31. prosinca 1969., 23:59:59 UTC. To je upravo ono što 32-bitno prelijevanje proizvodi 2038. godine, zbog čega sat izgleda kao da skače natrag u 1901.

Zašto Unix vrijeme ignorira prijestupne sekunde?

Kako bi matematika ostala jednostavna i predvidljiva. Tretiranje svakog dana kao točno 86.400 sekundi znači da su trajanja samo oduzimanje, a vremenske oznake ostaju monotone. Malo neslaganje s astronomskim UTC-om rješava se "razmazivanjem" prijestupne sekunde, što gotovo sve aplikacije preferiraju u odnosu na suočavanje s rubnim slučajem 23:59:60.

Kako pretvoriti vremensku oznaku bez pisanja koda?

Koristite online alat. pretvarač Unix vremenske oznake prihvaća epohalnu vrijednost i trenutno prikazuje odgovarajući UTC i lokalni datum i vrijeme, a također pretvara kalendarske datume natrag u vremenske oznake.

Sadašnje vrijeme u ove gradove:

Amsterdam · Bangkok · Barcelona · Peking · Berlin · Buenos Aires · Kairo · Kopenhagen · Delhi · Dubaj · Istanbul · Johannesburg · Karachi · Ljubljana · London · Los Angeles · Madrid · Manila · Mexico City · Moskva · Mumbai · Novi York · Pariz · Rejkjavik · Riga · Rim · Seul · Šangaj · Sidnej · Tokio · Vilnius · Zagreb

Sadašnje vrijeme u zemljama:

🇦🇷 Argentina | 🇦🇺 Australija | 🇧🇷 Brazil | 🇨🇦 Kanada | 🇨🇳 Kina | 🇭🇷 Hrvatska | 🇪🇬 Egipat | 🇫🇷 Francuska | 🇩🇪 Njemačka | 🇮🇸 Island | 🇮🇳 Indija | 🇮🇩 Indonezija | 🇮🇷 Iran | 🇮🇹 Italija | 🇯🇵 Japan | 🇱🇻 Letonija | 🇱🇹 Litvanija | 🇲🇽 Meksiko | 🇳🇱 Nizozemska | 🇳🇬 Nigerija | 🇵🇰 Pakistan | 🇵🇭 Filipini | 🇷🇺 Rusija | 🇸🇦 Saudijska Arabija | 🇸🇮 Slovenija | 🇿🇦 Južnoafrička Republika | 🇰🇷 Južna Koreja | 🇪🇸 Španjolska | 🇸🇪 Švedska | 🇨🇭 Švicarska | 🇹🇭 Tajland | 🇬🇧 Ujedinjeno Kraljevstvo | 🇻🇳 Vijetnam |

Sadašnje vrijeme u vremenske zone:

UTC | GMT | CET | PST | MST | CST | EST | EET | IST | Kina (CST) | JST | AEST | SAST | MSK | NZST |

Besplatno widgeti za web-mjesto:

Besplatni analogni sat s widgetom | Besplatni digitalni sat widget | Besplatni tekstualni sat widget | Besplatni riječki sat widget