Unix laiko žymeklio konvertavimas į datą

Konvertuokite Unix laiko žymeklį į skaitomą datą ir laiką — arba bet kurią datą atgal į Unix laiko žymeklį. Palaiko sekundes ir milisekundes.

Dabartinis Unix laiko žymeklis

Laiko žymeklis → Data

UTC
Vietos laikas
ISO 8601
Santykinis

Data → Laiko žymeklis

Sekundės (s)
Milisekundės (ms)

Kas yra Unix laiko žyma?

Unix laiko žyma (Unix timestamp), dar vadinama Unix laiku arba POSIX laiku, yra sekundžių skaičius, praėjęs nuo 1970-01-01 00:00:00 UTC, vadinamo Unix epocha. Tai plačiai naudojamas kompiuterijos standartas, nes jis atvaizduoja konkretų laiko momentą kaip vieną sveikąjį skaičių, todėl saugojimas, palyginimas ir aritmetika tampa paprasti.

JavaScript viduje naudoja milisekundes, todėl Date.now() grąžina Unix laiko žymą, padaugintą iš 1000. Daugelis API, duomenų bazių ir backend sistemų vietoje to naudoja sekundes. Šis įrankis priima abu formatus ir automatiškai aptinka sekundes arba milisekundes pagal įvedamo skaičiaus dydį.

Žymios Unix laiko žymos

Laiko žymaData (UTC)Pastaba
01970-01-01 00:00:00Unix epocha
1,000,000,0002001-09-09 01:46:401 milijardas sekundžių
2,000,000,0002033-05-18 03:33:202 milijardai sekundžių
2,147,483,6472038-01-19 03:14:072038 metų problema (maks. 32 bitų)

Kodėl 1970?

Unix epocha, prasidedanti 1970 m. sausio 1 d., buvo pasirinkta iš dalies dėl susitarimo, o iš dalies dėl praktinių apribojimų. Unix buvo kuriama 1960-ųjų pabaigoje ir 1970-ųjų pradžioje Bell Labs. Kūrėjams reikėjo palyginti naujos, „apvalios“ pradžios datos laiko atvaizdavimui. 1970 m. sausio 1 d. buvo pakankamai nesena, kad būtų praktiška, ir neturėjo ypatingos techninės reikšmės — tai tiesiog patogus atskaitos taškas.

Kitos sistemos turi kitokias epochas: Windows FILETIME epocha yra 1601 m. sausio 1 d.; GPS laikas prasidėjo 1980 m. sausio 6 d.; NTP epocha yra 1900 m. sausio 1 d. Konvertuojant tarp sistemų, būtina žinoti kiekvienos sistemos epochą.

Sekundės vs milisekundės

Originali Unix laiko žyma yra sekundėmis. Dauguma serverio pusės kalbų ir sistemų (Unix shell, Python time.time(), PHP time(), dauguma duomenų bazių) naudoja sekundes. JavaScript Date.now() ir new Date().getTime() grąžina milisekundes. Šis nesutapimas dažnai sukelia klaidas, kai JavaScript frontendas bendrauja su backend API.

Unix laiko žyma sekundėmis šiuo metu yra 10 skaitmenų skaičius (apie 1,700,000,000, kaip buvo 2023 m.). Milisekundžių laiko žyma yra 13 skaitmenų. Skaičiuotuvas nustato, kurį formatą įvedėte, pagal skaitmenų skaičių ir atitinkamai konvertuoja.

2038 metų problema

Sistemos, kurios Unix laiko žymas saugo kaip pasirašytą 32 bitų sveikąjį skaičių, gali atvaizduoti datas tik iki 2,147,483,647 sekundžių po epochos — tai yra 2038 m. sausio 19 d. 03:14:07 UTC. Po šio momento 32 bitų pasirašytas sveikasis skaičius persipildo į didelį neigiamą skaičių, atvaizduojantį datą 1901 m.

Tai kartais vadinama „Y2K38“ problema arba Unix tūkstantmečio klaida. Šiuolaikinės 64 bitų sistemos nėra paveiktos, nes pasirašytas 64 bitų sveikasis skaičius gali atvaizduoti laiko žymas maždaug 292 milijardus metų. Tačiau įterptosios sistemos, senos duomenų bazės ir senesnė 32 bitų programinė įranga vis dar gali būti pažeidžiamos. Daugelyje industrijų — įskaitant telekomunikacijas, bankininkystę ir pramonines valdymo sistemas — vyksta migracijos darbai, siekiant tai išspręsti.

Kaip gauti dabartinę Unix laiko žymą

Kalba / aplinkaKomanda
JavaScriptMath.floor(Date.now() / 1000)
Pythonimport time; int(time.time())
PHPtime()
Bashdate +%s
SQL (PostgreSQL)EXTRACT(EPOCH FROM NOW())::int
SQL (MySQL)UNIX_TIMESTAMP()
Gotime.Now().Unix()
RustSystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()

Praktinės paskirtys

API kūrimas: REST API dažnai naudoja Unix laiko žymas created_at, updated_at ir žetonų galiojimo pabaigos laukams. Laiko žyma nepriklauso nuo laiko juostos ir yra vienareikšmė — priešingai nei formatuotos datos eilutės, kurios priklauso nuo lokalės ir formatavimo taisyklių.

Žetonų galiojimas: JWT (JSON Web Tokens) naudoja Unix laiko žymas exp (galiojimo pabaiga) ir iat (išdavimo laikas) claim'ams. Žetonas nustoja galioti, kai dabartinė laiko žyma viršija exp reikšmę. Skaičiuojant galiojimo pabaigą — pvz., „šis žetonas turi galioti 24 valandas“ — reikia prie dabartinės laiko žymos pridėti 86 400 sekundžių.

Talpyklos TTL: Talpyklos galiojimas dažnai nustatomas kaip Unix laiko žyma arba kaip sekundžių skaičius nuo dabar. Derinant talpyklos problemas dažnai pirmas žingsnis yra konvertuoti saugomą galiojimo laiko žymą į žmogui suprantamą datą.

Žurnalų analizė: Serverių žurnalai dažnai turi Unix laiko žymas. Paversti jas į skaitomas datas yra pirmas žingsnis siejant įrašus su realiais įvykiais.

Duomenų bazių saugojimas: Laiko žymų saugojimas kaip sveikųjų skaičių, o ne formatuotų eilučių padeda išvengti laiko juostų konvertavimo klaidų ir supaprastina rikiavimą, intervalų užklausas ir aritmetiką. Užklausa „visi įrašai per paskutines 7 dienas“ tampa WHERE created_at > (NOW_UNIX - 604800).