Unix-aikaleimat ilman päänsärkyä
Kysy kolmelta kehittäjältä, mitä kello on, ja saatat saada kolme eri vastausta riippuen siitä, missä he istuvat. Kysy Unix-aikaleimalta, ja saat täsmälleen yhden luvun, saman jokaiselle planeetalla. Tuo yksittäinen kokonaisluku on syy siihen, miksi epoch-aika hiljaisesti tukee lähes jokaista lokitiedostoa, tietokantariviä ja API-vastausta, johon koskaan kosket. Tämä sivu selittää, mitä tuo luku tarkoittaa, miten se luetaan molempiin suuntiin, ja missä se yleensä puree.

Mitä Unix-aika oikeastaan on
Unix-aikaleima on sekuntien määrä, joka on kulunut ajasta 00:00:00 UTC 1. tammikuuta 1970, karkaussekunteja laskematta. Tuota hetkeä kutsutaan epochiksi, ja varhaiset Unix-insinöörit valitsivat sen yksinkertaisesti siksi, että se oli kätevä pyöreä päivämäärä, josta laskea. Epoch-hetkellä arvo on tarkalleen 0. Jokainen sen jälkeinen sekunti lisää yhden, joten luku vain kasvaa. Myös ennen vuotta 1970 sijoittuvat päivämäärät ovat täysin päteviä, ilmaistuna negatiivisina kokonaislukuina.
Näet tämän käsitteen myös nimillä POSIX-aika tai löyhemmin epoch-aika. Nimestä riippumatta mekaniikka on sama: yksi jatkuvasti kasvava sekuntilaskuri. Koska se on pelkkä kokonaisluku eikä muotoiltu merkkijono, tietokone voi tallentaa sen muutamaan tavuun ja verrata kahta arvoa yhdellä vähennyslaskulla.
Sekunnit, millisekunnit ja muut
Klassinen Unix-aika laskee kokonaisia sekunteja, mikä antaa tutun kymmennumeroisen luvun, jonka näet tänään. Mutta monet ympäristöt tarvitsevat tarkempaa resoluutiota. JavaScript esimerkiksi toimii millisekunneissa, tuottaen kolmentoista numeron arvon, ja jotkin järjestelmät menevät vielä pidemmälle mikrosekunteihin tai nanosekunteihin. Luotettava nyrkkisääntö: kymmennumeroinen luku on sekunteja, kolmetoistanumeroinen on millisekunteja. Jos muunnettu päivämääräsi osuu jonnekin vuoden 1970 tienoille, kun odotit nykyhetkeä, olet lähes varmasti syöttänyt millisekunteja sekuntikenttään, tai toisin päin. Muuntimemme tunnistaa suuruusluokan automaattisesti, joten sinun ei tarvitse yleensä arvailla.
Miksi kehittäjät turvautuvat siihen
Suuri hyöty on se, että aikaleima on aikavyöhykkeetön. Kokonaisluku 1735689600 viittaa samaan hetkeen Tokiossa, Berliinissä ja São Paulossa. Tuon luvun tallentaminen muotoillun paikallisen merkkijonon sijaan tarkoittaa, ettei sinun koskaan tarvitse miettiä, mihin kelloon arvo kuului. Lajittelu on myös triviaalia, koska kronologinen järjestys on pelkkää numeerista järjestystä, joten aikaleimasarakkeen tietokantaindeksi lajittelee tapahtumat oikein ilman jäsentämistä. Aritmetiikka on yhtä siistiä: kahden tapahtuman välinen väli on yksi vähennyslasku, ja päivän lisääminen on 86400:n lisäämistä. Nämä ominaisuudet ovat juuri syy siihen, miksi lokit, tokenit, välimuistit ja viestijonot kaikki turvautuvat epoch-aikaan.
Muunnos molempiin suuntiin
Aikaleimasta ihmisen luettavaan päivämäärään siirtyminen tarkoittaa sekuntimäärän ottamista ja sen projisoimista kalenteriin, ja sitten sen muotoilemista mihin tahansa aikavyöhykkeeseen, josta välität. Toiseen suuntaan otat vuoden, kuukauden, päivän ja kellonajan, päätät mikä aikavyöhyke se on ilmaistuna, ja tiivistät sen takaisin sekunneiksi epochista. Työkalumme tekee molemmat suunnat välittömästi ja kokonaan selaimessasi, joten mitään liittämääsi ei poistu koneeltasi. Liitä luku purkaaksesi sen, tai valitse päivämäärä koodataksesi sen, ja lue tulos sekä UTC:na että paikallisena aikana samalla hetkellä.

UTC vastaan paikallinen aika, klassinen ansa
Itse aikaleimalla ei ole aikavyöhykettä; se on aina ankkuroitu UTC:hen. Sekaannus ilmenee vasta, kun näytät sen. Jos muunnat luvun 1700000000 ja näytölläsi näkyy iltatunti, kun taas kollegasi toisessa maassa näkee iltapäivätunnin, mikään ei ole rikki, katsotte vain samaa hetkeä eri paikallisilla kelloilla renderöitynä. Bugeja syntyy, kun koodi lukee paikallisen päivämäärän ikään kuin se olisi UTC, tai leimaa seinäkellon ajan tallentamatta poikkeamaa. Turvallinen tapa on tallentaa ja siirtää UTC:tä, ja soveltaa paikallista poikkeamaa vasta aivan viimeisenä hetkenä, kun näytät arvon ihmiselle. Jos olet epävarma, vertaa muuntimen UTC-riviin sen sijaan, että vertaisit paikallista riviä.
Vuoden 2038 ongelma
Monet vanhemmat järjestelmät tallensivat Unix-ajan etumerkillisenä 32-bittisenä kokonaislukuna. Tuo kenttä loppuu kesken yhden sekunnin kuluttua kellonajasta 03:14:07 UTC 19. tammikuuta 2038, kun laskuri ylivuotaa ja kiertyy negatiiviseksi luvuksi, mahdollisesti heittäen päivämäärät takaisin vuoteen 1901. Se on samaa ongelmaperhettä kuin Y2K. Hyvä uutinen on, että modernit käyttöjärjestelmät ja kielet ovat suurelta osin siirtyneet 64-bittisiin aikaleimoihin, jotka eivät ylivuoda noin 292 miljardiin vuoteen, joten uudelle koodille se on enimmäkseen historiallinen kuriositeetti tuntea kuin hätätapaus.
Lisää selainpohjaisia apuvälineitä löydät kehittäjätyökaluistamme, ja jos tarvitset työstää lukuja itseään, laskimet ovat klikkauksen päässä.
Usein kysytyt kysymykset
Mikä on Unix-aikaleima?
Se on sekuntien määrä ajasta 00:00:00 UTC 1. tammikuuta 1970, karkaussekunteja laskematta. Tuota alkuhetkeä kutsutaan epochiksi, ja laskuri vain kasvaa ajan myötä.
Miksi lukuni muuntuu vuoden 1970 tienoille osuvaksi päivämääräksi?
Todennäköisesti sekoitit sekunnit ja millisekunnit keskenään. Kymmennumeroinen luku on sekunteja ja kolmetoistanumeroinen luku on millisekunteja. Millisekuntien syöttäminen sekuntikenttään jakaa näennäisen ajan noin tuhannella, sijoittaen sinut lähelle epochia.
Onko Unix-aikaleimalla aikavyöhykettä?
Ei. Arvo on aina ankkuroitu UTC:hen. Aikavyöhyke tulee kuvaan vasta, kun näytät aikaleiman ihmisen luettavana päivämääränä, minkä vuoksi sama luku voi näyttää eri kellonajan eri ihmisille.
Miten muunnan päivämäärän takaisin aikaleimaksi?
Anna vuosi, kuukausi, päivä ja kellonaika, päätä mikä aikavyöhyke tuo päivämäärä on ilmaistuna, ja työkalu tiivistää sen sekunneiksi epochista. Voit tehdä molemmat suunnat tällä sivulla välittömästi selaimessasi.
Mikä on vuoden 2038 ongelma?
Järjestelmät, jotka tallentavat Unix-ajan etumerkillisenä 32-bittisenä kokonaislukuna, ylivuotavat yhden sekunnin kuluttua kellonajasta 03:14:07 UTC 19. tammikuuta 2038. Modernit 64-bittiset aikaleimat välttävät tämän miljardeiksi vuosiksi, joten suurin osa nykyisestä ohjelmistosta ei kärsi siitä.
Lähetetäänkö datani palvelimelle?
Ei. Muunnos tapahtuu kokonaan selaimessasi, joten mikä tahansa liittämäsi aikaleima tai päivämäärä pysyy omalla laitteellasi.
