Aasta 2038 probleem: mis see on, miks tekib ja kuidas lahendada
Aasta 2038 probleem on ajahalduse viga, mis võib tekitada tõrkeid arvutites ja seadmetes, mis salvestavad aja 32-bitiste täisarvudena sekundite arvuna alates 1. jaanuarist 1970 (nn Unix-epohh). Sellist aega hoitakse tavaliselt tüübis time_t või sarnases formaat, kus kasutatakse märgitud (signed) 32-bitist arvu.
Miks see probleem tekib
32-bitine märgitud täisarv suudab salvestada väärtuseid vahemikus -2^31 kuni 2^31-1 ehk -2 147 483 648 kuni 2 147 483 647. Kui sekundite loendur jõuab maksimaalsele väärtusele 2 147 483 647, siis järgmisel sekundil toimub ületäitumine ja väärtus pöördub negatiivseks (kõige väiksemaks võimalikuks väärtuseks), mis tõlgitakse ajana 13. detsembril 1901. Seega viimane "õige" hetk, mida 32-bitine ajaesitus suudab esitada UTC-s, on 19. jaanuar 2038 kell 03:14:07 UTC. Pärast seda võib aeg näida valena või tagasi loendada.
Millised süsteemid on ohustatud
- Vananenud 32-bitised operatsioonisüsteemid ja rakendused, mis kasutavad time_t või muud 32-bitist ajatüüpi.
- Sisse ehitatud (embedded) seadmed: juhitavad seadmed, tööstusautomaatika, kodu- ja meditsiiniseadmed, routerid, printerid jne, mille firmvare pole uuendatud.
- Andmebaasid, failisüsteemid ja logid, mis kasutavad 32-bitist ajavälja (näiteks mõned süsteemid, kus TIMESTAMP on piiratud 2038. aastaga).
- Programmid ja keeled, mis sõltuvad platvormi C-teekide ajatüüpidest (nt vanemad C/C++ programmid, Python, PHP sõltuvalt platvormist).
Millised võivad olla tagajärjed
- Vale kuupäevade kuvamine ja salvestamine logides, aruannetes ja failides.
- Kellapõhiste ajastuste ja ajastatud ülesannete ebaõnnestumine (cron-järgsed tööd, piletisüsteemid, litsentside kehtivuse kontroll).
- Turvasertifikaatide ja turvamehhanismide valesti hindamine (näiteks aegumiskuupäevad), mis võib põhjustada ühenduste katkestatust.
- Andmebaasi- või rakendusevead, mis võivad viia vigaste andmete või süsteemi ebastabiilsuseni.
Kuidas probleemi lahendada
Peamised lahendused keskenduvad ajaesituse laiendamisele 64-bitisele või muule mittevajutavale vormingule:
- Kasuta 64-bitist ajaesitust (nt 64-bitine time_t või int64_t sekundite loendur). 64-bitine loendur ei nulli miljoneid aastaid ning on kõige otsesem ja soovitatav lahendus.
- Uuenda operatsioonisüsteemi ja firmvare — paljud kaasaegsed 64-bitised süsteemid juba kasutavad 64-bitist aega; vanemate 32-bitiste süsteemide tootjad ja Linux/BSD on avaldanud ajumuudatusi ja patch'e, mis võimaldavad 64-bitist aega ka 32-bitistel platvormidel.
- Väldi 32-bitiseid ajavälju andmebaasides ja failiformaatides — näiteks mõnes andmebaasis on TIMESTAMP piiratud 2038. aastaga; parem on kasutada laiema ulatusega tüüpe (nt DATETIME või stringipõhised ISO 8601 vormingud, int64 sekunditega jne).
- Kohanda ja rekodeeri tarkvara nii, et see kasutaks int64 tüüpe või standardseid ajaraamistikke (nt POSIX timespec, POSIX-laiendused), ja testi uuesti kompileerituna erinevatel platvormidel.
- Hoolda ja uuenda sisse ehitatud seadmeid — paljud seadmestikud ei saa automaatselt tarkvara uuendada, seega on vajalik tootja uuendus või seadme välja vahetamine.
Praktiline kontroll ja testimine
- Kaardista inventuur: tee nimekiri kõikidest süsteemidest ja seadmetest, mis võivad kasutada 32-bitist aega (vanad serverid, võrguseadmed, tööstusseadmed jne).
- Kontrolli lähtekoodi ja sõltuvusi: otsi kasutust tüüpile time_t, time(), strftime jms ning vaata, kas need on 32- või 64-bitised antud platvormil.
- Testi ajaloogeneraatoritega või asenda süsteemi kell ajaks enne ja pärast 2038 kuupäeva (või kasuta libfaketime‑rünnakut/testimise tööriistu), et näha, kuidas rakendused käituvad.
- Kontrolli andmebaase: veendu, et kuupäeva- ja ajaväljad kasutaksid sobiva ulatusega tüüpe; MySQL-i puhul näiteks TIMESTAMP võib olla piiratud, DATETIME on laiema ulatusega.
Mida teha organisatsioonina — kiire kontrollnimekiri
- 1) Tee inventuur seadmetest ja tarkvarast.
- 2) Prioritreeri: esmalt kritilised süsteemid (pangandus, tervishoid, energeetika, side, turvasertifikaadid).
- 3) Uuenda OS/firmvare ja vajalikud teegid, mis toovad 64-bitise aja toe.
- 4) Rekodeeri ja kompileeri rakendused 64-bitise ajatoega, vajadusel uuenda andmebaasi skeeme.
- 5) Testi uuendusi liivakastis ja planeeri tootmisse viimine.
Kas muretsemiseks on veel aega?
Paljud tänapäevased 64-bitised serverid ja opsüsteemid juba kasutavad 64-bitist aega, seetõttu on suur osa tööstusest ohust vabastatud. Samas on probleem reaalne vanemate 32-bitiste süsteemide ja paigaldatud seadmete puhul, mille eluiga võib ulatuda kaugele tulevikku (nt 10–20+ aastat). Seetõttu on nendega tegelemine vajalik nüüd, et vältida ootamatuid katkestusi ja kulukaid hädasid 2038. aastal.
Lühike tehniline märkus
32-bitise ajatesi maksimaalne väärtus 2 147 483 647 vastab täpselt kellaajale 2038-01-19 03:14:07 UTC. Järgmisel sekundil (2147483648) teeb signed-int ületäitumise ja tulemuseks on -2 147 483 648, mida tõlgitakse kompleksi kuuenda sajandi asemel varasema ajana (1901. aasta detsember).
Kui võimalik, kasuta 64-bitist komplekti (int64) ajaväljadel ning uuenda kõik kriitilised komponendid enne 2038. aastat. See on peamine ja püsiv lahendus.


Animatsioon, mis näitab, kuidas kuupäev nullistub, kujutatuna 32-bitise täisarvuna (kell 03:14:08 UTC 19. jaanuaril 2038).