Unix-aika ja ISO 8601 -merkintätapa
SI:n ulkopuolinen yksikkö · suure: ajanhetki kokonaisina sekunteina vuodesta 1970
Yhdeksäntenätoista tammikuuta 2038 kello kolme neljätoista ja seitsemän sekuntia maailmanaikaa kolmenkymmenenkahden bitin levyinen sekuntilaskuri saavuttaa arvon 2 147 483 647 — suurimman luvun, jonka se kykenee sisällään pitämään. Seuraava tikitys nostaa ylimmän bitin, ja sama binäärisana luetaan tästedes negatiivisena: kellot, jotka pitävät aikaa juuri tällä laskennalla, päätyvät ei vuoteen 2038 vaan joulukuuhun 1901. Kaukaisen tulevaisuuden kummallisuus tämä ei ole — teollisuusohjain tai vesimittari palvelee kauemmin kuin ne kaksitoista vuotta, jotka ovat jäljellä.
Laskenta on rakennettu äärimmäisen yksinkertaisesti: sekunnit juoksevat peräkkäin ensimmäisen tammikuuta 1970 keskiyöstä, ja vuorokausi sisältää siinä aina tasan 86 400 sekuntia. Juuri yksinkertaisuus on molempien erikoisuuksien lähde. Yhtäältä luvusta seuraa kalenteripäivä silmänräpäyksessä ja päinvastoin, joten jokainen tapahtumaloki, jokainen tietokanta ja jokainen tiedostojärjestelmä pitää aikaa sillä. Toisaalta karkaussekuntia ei sellaisessa laskennassa voi lainkaan ilmaista, mikä tarkoittaa, että se nimestään huolimatta ei numeroi sekunteja vaan vuorokausia murto-osineen, ja on todellisuudessa UTC-merkinnän lineaarinen funktio eikä kuluneen ajan laskuri.
01 · Määritelmä
Unix-aika on sekuntien määrä, joka on kulunut ensimmäisen tammikuuta 1970 keskiyöstä koordinoitua maailmanaikaa, sillä oletuksella, että jokainen vuorokausi sisältää tasan 86 400 sekuntia. ISO 8601 -merkintätapa esittää saman toisin: kalenteripäivällä, kellonajalla ja ilmoituksella poikkeamasta nollameridiaanista, ja kentät juoksevat tiukasti karkeasta hienoon.
Varaus 86 400 sekunnista ei ole pikkuseikka vaan määritelmän olennaisin kohta. Karkaussekuntia, jonka Maan pyörähdyspalvelu julistaa, laskenta ei voi ottaa vastaan, ja siksi järjestelmä lisäyshetkellä joko toistaa yhden ja saman arvon kahdesti tai siirtää kelloa taaksepäin. Tästä seuraa tärkeä asia: kahden unix-luvun erotus ei ole se sekuntien määrä, joka kahden tapahtuman välillä todella kului, jos niiden väliin osui karkaussekunti — poikkeama atomiaika-asteikosta on jo kasvanut kahteenkymmeneenseitsemään sekuntiin.
Raja sen sijaan ei riipu määritelmästä vaan tallennuksen leveydestä. Kolmekymmentäkaksi bittiä etumerkin kanssa antaa suurimmaksi arvoksi 2 147 483 647, joka osuu yhdeksännelletoista tammikuuta 2038; seuraava lisäys asettaa ylimmän bitin ykköseksi ja tekee luvusta negatiivisen, jolloin kello sinkoutuu kolmanteentoista joulukuuta 1901. Kuusikymmentäneljä bittiä työntää rajan kahdensadanyhdeksänkymmenenkahden miljardin vuoden päähän, mutta kokonaiset nanosekunnit samoissa kuudessakymmenessäneljässä bitissä loppuvat jo vuonna 2262.
Standardin mukainen merkintä ratkaisee toisen tehtävän — vaihdon eikä tallennuksen — ja siksi siinä painavat asiat, joita luvulla ei lainkaan ole: aikavyöhyke, erotin päivän ja ajan välillä sekä sääntö, että yhtä pitkillä merkkijonoilla aakkosjärjestys osuu yhteen aikajärjestyksen kanssa. Juuri tämä viimeinen ominaisuus on tehnyt muodosta lajittelun perustan tiedostonimissä ja lokeissa.
Vie aikaa liukusäätimellä ja katso, miten rekisteri täyttyy: bitit syttyvät oikealta vasemmalle, ja niin kauan kuin ylin, etumerkkibitti, pysyy pimeänä, luku on positiivinen ja päivä kasvaa. Heti kun laskuri astuu arvon 2 147 483 647 ohi, ylin bitti leimahtaa punaisena, koko luvusta tulee negatiivinen ja kello hyppää vuoteen 1901.
Vihreä suora on atomiaika-asteikko, jolla jokainen sekunti on todella sekunti. Punainen porrasviiva on Unix-aika, joka jokaisen lisäyksen kohdalla antaa yhden ja saman aikaleiman kahdesti, minkä vuoksi viiva pysähtyy paikalleen. Poikkeama on jo kaksikymmentäseitsemän sekuntia ja kasvaa, ja siksi laskenta kelpaa kalenteripäivään mutta ei kestojen mittaamiseen fysiikassa.
02 · Muunnos
Syötä aikaleima tai päivämäärä
Kaikkien laskennan kerrannaisten välillä — sekuntien, millisekuntien, mikro- ja nanosekuntien — muunnokset ovat tarkkoja, koska ne eroavat vain kertoimella. Likimääräinen on yksi ainoa rivi: muunnos atomiaika-asteikkoon vaatii tietoa siitä, kuinka monta karkaussekuntia annettuun hetkeen mennessä on kertynyt.
Standardin mukaisen merkkijonon jäsentämisen lehti tekee laajennetussa merkinnässä Z-kirjaimen kanssa; perusmuoto ilman erottimia on hienosäädöissä.
Vuoden 2038 ongelma ei ole standardissa vaan laitteistossa ja vanhassa koodissa: kolmenkymmenenkahden bitin aikaleimat istuvat mittareiden laiteohjelmistoissa, teollisuusohjaimissa, tiedostojärjestelmien muodoissa ja tietokannoissa, joissa kenttä on jo julistettu neljäksi tavuksi. Tyypin vaihtaminen lähdekoodissa on kyllin helppoa; miljoonien asennettujen laitteiden läpikäynti jäljellä olevassa kahdessatoista vuodessa on samaa lajia oleva tehtävä kuin se, joka oli edessä ennen vuotta 2000.
| Arvo | Huomautus | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · Suuruusluokat
logaritminen asteikko: sekunnista kuudenkymmenenneljän bitin rajaan04 · Mittalaitteet
Millä tapahtumaan lyödään leima
Erillinen siru pariston kanssa, joka pitää laskentaa laitteen ollessa sammuksissa. Se tallentaa tavallisesti ei unix-leimaa vaan kalenterikentät erikseen, ja sen vuosikentän leveys on oma, joten vanhoilla piirilevyillä keskustelu vuodesta 2038 alkaa kysymyksestä, mihin vuoteen asti siru itse laskee.
NTP-yhteyskäytäntö tuo koneen kellon yhteiseen aikaan muutaman millisekunnin tarkkuudella, ja se myös varoittaa lisäyksestä omalla lipulla vuorokautta aiemmin. Oma rajansa sillä on myös, ja se tulee aiemmin: laskenta juoksee vuodesta 1900 etumerkittömissä kolmessakymmenessäkahdessa bitissä ja vuotaa yli helmikuussa 2036.
Lokiin aikaleima kirjoitetaan joko lukuna tai standardin mukaisena merkkijonona, ja jälkimmäinen on parempi täsmälleen yhdestä syystä: yhtä pitkillä merkkijonoilla aakkosjärjestys osuu yhteen aikajärjestyksen kanssa, joten merkinnät lajittuvat ilman päivämäärän jäsentämistä. Juuri siksi muoto on levinnyt kauas tietotekniikan ulkopuolelle.
Laitteen valmiuden vuoteen 2038 voi koetella yhdellä ainoalla tavalla — siirtämällä sen kellon kohtalokkaan rajan yli ja katsomalla, mitä lokeista, varmenteista ja aikavälilaskennasta tulee. Näin on jo löydetty vikoja laskutuksesta, kulunvalvonnasta ja avainten voimassaoloajoista, joissa tulevaisuuden päivä muodostetaan yhteenlaskulla ja se vuotaa yli kauan ennen itse rajaa.
05 · Kirjoitussäännöt
Karkeasta hienoon, ja aina aikavyöhykkeen kanssa
Standardi vaatii kenttien laskevaa järjestystä, vuoden neljää numeroa, yhdysmerkkiä päivän erottimena ja T-kirjainta ennen aikaa; aikavyöhyke ilmoitetaan joko Z-kirjaimella nollameridiaanille tai plus-miinus tunteina ja minuutteina. Unix-leima kirjoitetaan kokonaislukuna ilman numeroryhmitystä, ja kerrannainen on aina täsmennettävä, koska tuhannen kerroin erottaa sekunnit millisekunneista ja ne on luvun suuruuden perusteella helppo sekoittaa.
Ensimmäinen merkintä luetaan eri maissa eri tavoin ja on siksi tiedonvaihdossa kelvoton. Toinen jättää pois sekä erottimen että aikavyöhykkeen, joten hetki jää määrittelemättömäksi vuorokauden verran kumpaankin suuntaan. Kolmas menettää alkunollat, minkä vuoksi merkkijonot lakkaavat lajittumasta aakkosittain — ja juuri siitä ominaisuudesta muotoa arvostetaan. Neljäs rinnastaa unix-laskennan atomiaika-asteikkoon, vaikka niiden välissä on kaksikymmentäseitsemän sekuntia kertyneitä karkaussekunteja.
06 · Naapuriyksiköt
Vieressä ovat kaikki laskennat, jotka on rakennettu saman periaatteen mukaan mutta toisesta alusta: NTP-aika vuodesta 1900, juliaaninen päivä vuoden 4713 ennen ajanlaskun alkua keskipäivästä, satelliittijärjestelmän asteikko tammikuusta 1980. Ne eroavat vain epookilta ja yksiköltä, ja siksi ne muunnetaan vähentämällä vakio.
etumerkilliset sekunnit
sen raja osuu jo vuoteen 2036
karkaussekunnit laskettu rehellisesti
Simetriumin korteista vieressä ovat juliaaninen päivä, josta muunnosvakio on otettu, asteikot UTC, TAI ja UT1, jotka selittävät kadonneet karkaussekunnit, sekunti laskennan yksikkönä, ja bitti, jonka leveys rajan määrää.
07 · Historiallinen osa
Epookki, joka valittiin bittien puutteesta
Ensimmäisessä unix-käsikirjassa aikaa laskettiin sekunnin kuudeskymmenesosina vuoden 1971 alusta, ja kolmessakymmenessäkahdessa bitissä sellainen laskenta veti vain runsaat kaksi vuotta. Ne loppuivat niin nopeasti, että epookkia olisi pitänyt siirtää järjestelmän jokaisen julkaisun yhteydessä, ja sekunnin murto-osista luovuttiin kokonaisten hyväksi.
Siirtymällä kokonaisiin sekunteihin kehittäjät saivat sadankolmenkymmenenkuuden vuoden varaston ja saattoivat valita alun mukavuuden eikä pakon mukaan. Otettiin ensimmäinen tammikuuta 1970 — lähin tasapäivä menneisyydessä, johon konemerkinnät eivät kuitenkaan ylettyneet — eikä sitä ole sen jälkeen kertaakaan muutettu, vaikka järjestelmä on kirjoitettu perusteista uudelleen useammin kuin kerran.
Kansainvälinen standardisoimisjärjestö kokosi hajaantuneet kansalliset muodot yhdeksi ja pani sen perustaksi yksinkertaisen säännön: kentät juoksevat karkeasta hienoon, kaikki alkunollineen. Sivuvaikutus osoittautui tarkoitusta tärkeämmäksi — sellaiset merkkijonot lajittuvat kuin luvut, ja muoto levisi tiedostonimiin, lokeihin ja vaihtokäytäntöihin.
Työpöytä- ja palvelinjärjestelmät siirtyivät kuuteenkymmeneenneljään bittiin kauan sitten, ja siellä raja on työnnetty kaiken järkevän näköpiirin taakse. Vaara on jäänyt muualle: kahdenkymmenen vuoden käyttöikäisten laitteiden laiteohjelmistoihin, tiedostomuotoihin, joissa kenttä on julistettu neljäksi tavuksi, ja tulevien määräaikojen laskentaan, joka vuotaa yli jo tänään heti kun nykyiseen päivään lisätään viisitoista vuotta.
Laskenta, joka nimestään huolimatta ei laske sekunteja
Unix-ajan määritelmä kuulostaa sekuntien laskennalta, mutta vaatimus tasaisista 86 400 sekunnista vuorokaudessa tekee siitä jotakin muuta: UTC-merkinnän lineaarisen funktion eikä kuluneen ajan mitan. Joka kerta kun Maan pyörähdyspalvelu julistaa lisäyksen, laskennan on toistettava yksi ja sama arvo kahdesti tai hypättävä taaksepäin, ja kahden leiman erotus menettää juuri sen sekunnin. Puolessa vuosisadassa tällaisia menetyksiä on kertynyt kaksikymmentäseitsemän, ja siksi tehtävissä, joissa tarvitaan todellinen kesto, otetaan atomiaika-asteikko eikä tätä.
Toinen erikoisuus ei ole lainkaan määritelmässä vaan tallennustavassa, ja se tekee siitä luettelomme ainoan rajan, jota ei ole asettanut luonto eikä sopimus vaan konesanan leveys. Juliaaninen päivä ei lopu koskaan, koska se on luku; Unix-aika loppuu yhdeksäntenätoista tammikuuta 2038, koska se on neljän tavun kenttä. Suureen ja sen esityksen ero askarruttaa metrologeja tavallisesti vähän, ja täällä juuri se ratkaisee kaiken.
Luettelo · mittayksiköt
Kortti jokaiselle suureelle
Seitsemän SI-perusyksikköä, kaksikymmentäkaksi johdettua omine nimineen ja järjestelmän ulkopuolisia suureita, joita ilman ei toimisi tekniikka eikä kalenteri.