Miten päiväys nollaantuu 32-bittisellä etumerkillisellä luvulla esitettynä (19. tammikuuta 2038 klo 3.14.08 UTC).
Lyhenteellä **Y2K38** tarkoitetaan Y2K-ongelmien kaltaista, 19. tammikuuta 2038 tapahtuvaa 32-bittisen kellon ympäripyörähtämistä ja sen aiheuttamia tietojenkäsittelyongelmia.

Unixin sukuisissa käyttöjärjestelmissä aikaa mitataan sekunteina Unix-ajan nollahetkestä (epookki), joka on 1. tammikuuta 1970 kello 0.00.00 UTC. Näissä käyttöjärjestelmissä ja niille tehdyissä sovelluksissa ajan esittämiseen käytetään C-kielen vakiokirjastossa määriteltyä `time_t`-sekuntilaskuria. `time_t` puolestaan on perinteisesti ollut 32-bittinen etumerkillinen luku. Suurin sillä ilmaistava sekuntimäärä vastaa hetkeä 3.14.07 UTC tiistaina 19. tammikuuta 2038.

64-bittisyyden mahdollistavalle suoritinarkkitehtuurille rakennetuissa Unixin sukuisissa käyttöjärjestelmissä (esimerkiksi Linux AMD64:lle) on siirrytty käyttämään 64-bittistä `time_t`:tä, jolla 32-bittisen luvun rajallisuuden aiheuttama ongelma siirtyy miljardien vuosien päähän. 64-bittiset järjestelmät saattavat palvelin- ja henkilökohtaisissa tietokoneissa syrjäyttää 32-bittiset ennen kriittistä ajankohtaa: niihin siirtyminen alkoi laajasti palvelimissa 1990-luvulla ja pöytäkoneissakin 2000-luvun alussa.
Sen sijaan sulautetut järjestelmät ovat edelleen lähes täysin 16- tai 32-bittisiä, ja niiden käyttöikä voi olla vuosikymmeniä.
Ongelmiin saatetaan törmätä myös 32-bittisissä järjestelmissä jo paljon ennen varsinaista Y2K38-hetkeä: tietoturvayhtiö F-Securen mukaan esimerkiksi 25-vuotisen lainan koron laskeminen voi aiheuttaa ongelmia jo 19. tammikuuta 2013 jälkeen.

Tilapäisratkaisuna on esitetty 32-bittisen `time_t`:n muuttamista etumerkittömäksi ottamalla etumerkin bitti käyttöön ajan arvolle. Näin siirtymälle saataisiin lisäaikaa, mutta toisaalta etumerkitön 32-bittinen `time_t` ei voi ilmaista ajankohtia ennen 1.1.1970 (epookki). Ongelmana on myös, että jos `time_t`:n tyyppiä muutetaan, sitä käyttävät ohjelmat – käytännössä lähes kaikki ohjelmat – on käännettävä uudelleen. Lisäksi sovellusten etumerkillistä `time_t`:tä käyttäneessä muodossa tallentamat tiedostot muuttuvat uuden käännöksen kanssa yhteensopimattomiksi.

Ytimen järjestelmäkutsuihin tehtyjen päivityksien lisäksi sovellusohjelmat on päivitettävä käyttämään 64-bittistä tietotyyppiä. Linux-ytimen versiossa 5.6 on lisätty myös 32-bittisille alustoille tuki 64-bittiselle aikaleimalle ongelman ratkaisemiseksi: aiemmin 64-bittinen aikaleima oli vain 64-bittisillä alustoilla. 64-bittinen aikaleima riittää 292 miljardiksi vuodeksi.

MySQL:n `UNIX_TIMESTAMP()`-funktio palauttaa arvon nolla 1.1.2038 jälkeen.

Katso myös
----------

* Unix-aika

Lähteet
-------

1. ↑
2. ↑
3. ↑  S. Harshini & K.R. Kavyasri & P. Bhavishya & T. Sethukkarasi: Digital World Bug: Y2k38 an Integer Overflow Threat-Epoch (PDF) *ijcseonline.org*.  31.3.2017. Viitattu 16.9.2022. (englanniksi)
4. ↑  Jonathan Corbet: Approaching the kernel year-2038 end game *lwn.net*.  11.1.2019. Viitattu 20.10.2020. (englanniksi)
5. ↑  Arnd Bergmann: y2038: core, driver and file system changes *lkml.org*.  29.1.2020. Viitattu 25.2.2021. (englanniksi)
6. ↑  Trond Endrestøl: When does the 64-bit Unix time\_t really end? *ximalas.info*.  10.3.2015. Viitattu 24.9.2022. (englanniksi)
7. ↑