Unix vremenske oznake i Epoch vreme: Problem 2038. godine, objašnjen

Objavljeno: 9:00 AM , autor Redakcija Vremeu.rs

Unix vremenske oznake objašnjene: sekunde od epohe 1970, UTC konverzija, preliv 2038. u 03:14:07 UTC, 64-bitno rešenje i prestupne sekunde.

Prikaz digitalnog sata koji se prebacuje sa 03:14:07 UTC 19. januara 2038, ilustrujući 32-bitni Unix vremenski preliv

Šta je Unix vremenska oznaka?

Unix vremenska oznaka je jedan broj: broj sekundi koje su protekle od Unix epohe, definisane kao 00:00:00 UTC 1. januara 1970. To je sve. Bez vremenske zone, bez niza datuma, bez imena meseci — samo ceo broj koji raste za jednu jedinicu svake sekunde.

Pošto je epoha fiksna i univerzalna, vremenska oznaka poput 1700000000 znači potpuno isti trenutak svuda na Zemlji. Server u Tokiju i laptop u Čikagu će se složiti da se odnosi na 14. novembar 2023. u 22:13:20 UTC. Lokalni prikaz se razlikuje po vremenskoj zoni, ali osnovni broj se nikada ne menja.

Jedno namerno pojednostavljenje: Unix vreme ignoriše prestupne sekunde. Pretpostavlja da svaki dan traje tačno 86.400 sekundi, što nije sasvim tačno u astronomskoj stvarnosti, ali održava aritmetiku čistom. Više o tome u nastavku.

Zašto ih inženjeri vole

Vremenske oznake su svuda u softveru — vremena izmene datoteka, zapisi u bazama podataka, API odgovori, JWT polja isteka, redovi logova — i to s dobrim razlogom:

  • To je jedna vrednost. Jedan ceo broj čuva pun datum i vreme. Bez parsiranja, bez dvosmislenosti oko MM/DD naspram DD/MM.
  • Agnostične su u pogledu vremenske zone. Broj je uvek UTC. Konvertujete u lokalno vreme samo kada ga prikazujete čoveku.
  • Lako se porede i sortiraju. Koji događaj je bio prvi? Manji ceo broj. Trajanje između dva događaja? Oduzmite ih; odgovor je u sekundama.
  • Kompaktno se skladište. Jedan ceo broj od 4 ili 8 bajtova naspram formatiranog niza.

Zbog toga toliko infrastrukture u pozadini govori u epohalnim sekundama, čak i kada vam interfejs pokazuje prijateljski 2026-07-23. Ako želite da se krećete između ove dve reprezentacije, Konvertor Unix vremenskog pečata vrši prevod u oba smera.

Čitanje jedne: Primer

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

Da biste je ručno pročitali, delite 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. Tačan trenutak je 09. septembar 2001, 01:46:40 UTC.

Ovu aritmetiku retko radite ručno — svaki jezik ima ugrađenu funkciju. U Python-u:

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

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

```

Ključna stvar: konverzija je uvek vezana za UTC. Funkcija pretvara sirovi broj sekundi u kalendarski datum tako što ide napred od epohe. Ako želite lokalno vreme umesto toga, primenjujete pomeraj vremenske zone nakon UTC konverzije — sama vremenska oznaka ne nosi informaciju o zoni.

Problem godine 2038.

Ovde priča postaje zanimljiva — i gde mnogi inače dobro izgrađeni sistemi imaju otkucavajući sat u sebi.

Decenijama je standardni C tip koji se koristi za Unix vreme, time_t, obično bio 32-bitni ceo broj sa znakom. 32-bitni ceo broj sa znakom može da predstavlja vrednosti od −2.147.483.648 do 2.147.483.647. Ta gornja granica je problem.

Brojeći sekunde od epohe 1970, vrednost 2.147.483.647 se dostiže u 03:14:07 UTC 19. januara 2038. Jednu sekundu kasnije, brojač treba da postane 2.147.483.648 — ali taj broj ne staje u 32-bitni ceo broj sa znakom. Umesto da nastavi da raste, bitovi se prelivaju i vraćaju na najnegativniju vrednost, −2.147.483.648.

Negativna vremenska oznaka se tumači kao vreme pre epohe. Dakle, sat ne samo da staje — već skače unazad u 13. decembar 1901. Svaki sistem koji je verovao svom 32-bitnom time_t iznenada veruje da je rani dvadeseti vek.

Ovo se često naziva Y2K38 bag ili Unix milenijumska buba, i strukturno je ista vrsta prelivanja fiksne širine koja je pokrenula paniku oko Godine 2000 — samo dalje u budućnosti i ukorenjena u granicama binarnih celih brojeva, a ne u dvocifrenim godinama.

Gde zapravo pogađa

Moderni 64-bitni desktopi i serveri su uglavnom popravljeni pre godina. Rizik je koncentrisan na mestima koja je teško ažurirati:

  • Ugrađeni i industrijski sistemi. Ruteri, kontroleri, medicinski uređaji, automobilski ECU-ovi i IoT hardver koji je isporučen sa 32-bitnim time_t i može raditi netaknut 20+ godina. Mnogi uređaji koji se danas postavljaju biće i dalje u upotrebi 2038.
  • Legacy C kod. Aplikacije kompajlirane sa starom definicijom time_t, posebno tamo gde je tip ušao u formate na disku ili mrežne protokole.
  • Stare baze podataka i datotečni sistemi. Formati skladištenja koji su pakovali vremenske oznake u 32-bitna polja. Neki stariji sistemi već pokazuju simptome kada rukuju datumima u dalekoj budućnosti — pomislite na 20-godišnji kredit ili istek sertifikata koji doseže posle 2038.

Način otkaza nije uvek dramatičan pad. Ponekad je to suptilno pogrešno izračunat datum: istekao token koji se čita kao važeći, redosled sortiranja koji se invertuje, zakazani posao koji se pokreće 1901.

Rešenje: 64-bitno vreme

Lek je jednostavan u principu — proširiti time_t na 64 bita. 64-bitni ceo broj sa znakom može da broji sekunde daleko izvan bilo kakvog praktičnog horizonta: tačka prelivanja je otprilike 292 milijarde godina u budućnosti, udobno posle očekivanog životnog veka Sunca.

Većina trenutnih operativnih sistema je već napravila ovaj potez. 64-bitni Linux koristi 64-bitni time_t; čak je i 32-bitni Linux dobio podršku za 64-bitno vreme u kernelu i glibc-u poslednjih godina. Težak deo nije sam popravak — to je pronalaženje i ponovno kompajliranje svakog poslednjeg dela firmvera, svakog skladištenog formata i svake treće strane binarne datoteke koja još uvek pretpostavlja 32 bita. Taj posao revizije je pravi projekat 2038.

Kako se prestupne sekunde uklapaju

Astronomsko vreme i atomsko vreme lagano odstupaju, pa zvanični UTC povremeno ubacuje prestupnu sekundu kako bi satovi ostali usklađeni sa rotacijom Zemlje. Unix vreme, po dizajnu, pretpostavlja da one ne postoje — tvrdo kodira 86.400 sekundi po danu.

Kada dođe do prestupne sekunde, sistemi obično "razmazuju" je — raspoređujući dodatnu sekundu kroz prozor (Google je popularizovao 24-časovno razmazivanje) tako da nijedan sat nikada ne mora da pokaže nemoguće 23:59:60. Rezultat: Unix vremenske oznake ostaju glatke i monotone, po cenu da su sićušni delić sekunde udaljene od strogog UTC tokom razmazivanja. Za praktično sav softver ovo je upravo kompromis koji želite. Prelivanje 2038. je problem širine celog broja; prestupne sekunde su posebna, mnogo manja definicijska osobenost — ne mešajte ih.

Ključni zaključci

  • Unix vremenska oznaka su sekunde od 00:00:00 UTC 1. januara 1970, prestupne sekunde se ignorišu.
  • To je jedan, agnostičan ceo broj u pogledu vremenske zone — lako se skladišti, poredi i sortira.
  • Konverzija je uvek relativna u odnosu na UTC; lokalno vreme se primenjuje naknadno.
  • 32-bitni time_t sa znakom se preliva u 03:14:07 UTC 19. januara 2038., vraćajući se na negativnu vrednost i skačući u 1901.
  • Rešenje je 64-bitni time_t; napor je revizija ugrađenih i legacy sistema.

Želite da vidite u akciji? Nalepite bilo koju vrednost epohe u Konvertor Unix vremenskog pečata da biste je pročitali kao ljudski datum — ili idite obrnutim putem i pretvorite datum u njegovu vremensku oznaku.

Često postavljana pitanja

Da li je Unix vremenska oznaka u sekundama ili milisekundama?

Klasično Unix vreme je u sekundama. Međutim, JavaScript i mnogi web API-ji koriste milisekunde od epohe, tako da je vrednost poput 1700000000000 1.000× veća. Brzi znak: vremenska oznaka u sekundama za skorašnji datum ima 10 cifara; ona u milisekundama ima 13. Kada ste u nedoumici, proverite veličinu pre konverzije.

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

Gotovo sigurno ne. Moderni 64-bitni operativni sistemi već koriste 64-bitni time_t, što pomera prelivanje milijardama godina u budućnost. Prava izloženost je u dugovečnim ugrađenim uređajima i starom softveru koji se još uvek oslanja na 32-bitno vreme i možda neće biti ažuriran pre 2038.

Može li Unix vremenska oznaka biti negativna?

Da. Negativne vrednosti predstavljaju trenutke pre epohe 1970 — na primer, -1 je 31. decembar 1969, 23:59:59 UTC. To je upravo ono što 32-bitno prelivanje proizvodi 2038, zbog čega sat izgleda kao da skače nazad u 1901.

Zašto Unix vreme ignoriše prestupne sekunde?

Da bi matematika ostala jednostavna i predvidljiva. Tretiranje svakog dana kao tačno 86.400 sekundi znači da su trajanja samo oduzimanje, a vremenske oznake ostaju monotone. Mala neusklađenost sa astronomskim UTC-om se rešava "razmazivanjem" prestupne sekunde, što gotovo sve aplikacije preferiraju u odnosu na suočavanje sa rubnim slučajem 23:59:60.

Kako da konvertujem vremensku oznaku bez pisanja koda?

Koristite online alat. Konvertor Unix vremenskog pečata prihvata vrednost epohe i trenutno prikazuje odgovarajući UTC i lokalni datum i vreme, a takođe konvertuje kalendarske datume nazad u vremenske oznake.

Vreme sada u ove gradove:

Амстердам · Бангкок · Барселона · Peking · Berlin · Буенос-Ајрес · Каиро · Kopenhagen · Delhi · Дубаи · Istanbul · Јоханесбург · Karachi · Лондон · Los-Angeles · Мадрид · Манила · Мексико-Сити · Москва · Mumbai · Њујорк-Град · Париз · Рим · Сеул · Šangaj · Sidnej · Токио · Београд

Sadašnje vreme u zemljama:

🇦🇷 Аргентина | 🇦🇺 Аустралија | 🇧🇷 Бразил | 🇨🇦 Канада | 🇨🇳 Кина | 🇪🇬 Египат | 🇫🇷 Француска | 🇩🇪 Немачка | 🇮🇳 Индија | 🇮🇩 Индонезија | 🇮🇷 Иран | 🇮🇹 Италија | 🇯🇵 Јапан | 🇲🇽 Мексико | 🇳🇱 Холандија | 🇳🇬 Нигерија | 🇵🇰 Пастан | 🇵🇭 Филипини | 🇷🇺 Русија | 🇸🇦 Саудијска-Арабија | 🇿🇦 Јужна-Африка | 🇰🇷 Јужна-Кореја | 🇪🇸 Шпанија | 🇸🇪 Шведска | 🇨🇭 Швајцарска | 🇹🇭 Тајланд | 🇬🇧 Уједињено-Краљевство | 🇻🇳 Вијетнам |

Vreme sada u vremenske zone:

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

Besplatno widgeti za vebmajstore:

Besplatan analogni sat widget | Besplatni digitalni sat widget | Besplatni tekstualni sat widget | Besplatni rečeni sat widget