Unix-aika ( englanniksi Unix-aika , myös POSIX-aika ) on Unixissa ja muissa POSIX - yhteensopivissa käyttöjärjestelmissä käytössä oleva järjestelmä ajan hetkien kuvaamiseen . Määritetään sekuntien lukumääränä keskiyöstä (00:00:00 UTC ) 1. tammikuuta 1970 (torstai); tätä hetkeä kutsutaan "Unix Epochiksi" ( eng. Unix Epoch ).
Unix-aikaa edustaa kokonaisluku , joka kasvaa jokaisen sekunnin myötä ilman, että tarvitaan laskelmia vuoden, kuukauden, päivän, tunnin tai minuutin määrittämiseksi ihmisen luettavuuden kannalta. Nykyaikainen Unix-aika on UTC :n mukainen - lähtölaskenta on SI sekunneissa . Yhden päivän aikajänne on lähes aina jaettu 86 400 sekuntiin , mutta kun karkaussekunnit ilmoitetaan, se on 86 401 sekuntia . Maailmanajan mukaan tällaiset sekunnit pitävät päivien pituuden synkronoituna planeetan vallankumousajan kanssa. Unix-ajassa vastaavat sekuntiluvut toistuvat, eli karkaussekunteja ei lasketa.
Klo 00:00:00 UTC 1. tammikuuta 1970 (torstai), Unix-aika on nolla. Tästä ajasta lähtien määrä kasvaa tietyllä määrällä päivässä. Siten esimerkiksi 16. syyskuuta 2004 klo 00.00.00, 12677 päivää Unix-ajan alkamisen jälkeen, aika olisi 12677 × 86400 = 1095292800 tai 17. joulukuuta 2003 klo 00.00:00 , 12403 päivää lähtölaskennan alkamisen jälkeen aika on numero 12403 × 86400 = 1 071 619 200 . Laskutoimitukset voidaan tehdä myös käänteisesti negatiivisia lukuja käyttämällä. Esimerkiksi päivämäärä 4. lokakuuta 1957 00:00:00, joka on 4472 päivää ennen lähtölaskentaa, esitetään Unix-ajassa numerolla −4472 × 86400 = −386380800 [1] .
Joka päivä Unix-aikaa edustava luku lasketaan UTC:ssä kuvatulla tavalla (00:00:00Z), ja se kasvaa täsmälleen yhdellä sekunnissa keskiyöstä alkaen . Siksi ajankohta 16-09-2004 17:55:43.54 , joka vastaa 64 543,54 sekuntia tämän päivämäärän keskiyöstä, esitetään yllä olevassa esimerkissä Unix-ajassa luvulla 1 095 292 800 + 64 543,54 = .3 5 4095 = .3 5 4095 . Myös laskennan alkamista edeltävien päivämäärien lukumäärä kasvaa, eli ajan myötä se lähestyy nollaa [2] .
Käytetty kokonaislukujärjestelmä on kätevä käyttää päivämäärien vertailuun ja tallentamiseen (päivämäärä ja kellonaika tässä muodossa vievät vain 4 tai 8 tavua ). Jos haluat viitata päivämääräelementteihin (päivä, kuukausi, vuosi), sekunnit voidaan muuntaa mihin tahansa sopivaan muotoon (ja päinvastoin).
Ohjelmat käyttävät etumerkillistä kokonaislukutyyppiä Unix - ajan tallentamiseen . Allekirjoitetut 32-bittiset numerot voivat viitata aikoihin perjantaina 13. joulukuuta 1901 klo 20.45.52 tiistaihin 19. tammikuuta 2038 klo 3.14.07 mukaan lukien.
Saat nykyisen Unix-ajan useimmissa Unix-tyyppisissä järjestelmissä käyttämällä päivämäärä +%s -komentoa .
Allekirjoitetun 32-bittisen merkinnän vähimmäispäivämäärä on 13. joulukuuta 1901 , 20:45:52 UTC (0x80000000, −2 147 483 648 sekuntia 1. tammikuuta 1970 alkaen).
Mahdollisesti kriittinen päivämäärä oli 9. syyskuuta 2001 , 01:46:40 UTC , joka vastaa yhtä gigasekuntia (miljardia sekuntia) Unix-aikaa, jolloin merkkien desimaaliesitys ylitti 9 paikkaa, mikä saattaa vaikuttaa joidenkin lääketieteellisten sovellusten toimintaan [3] .
Tärkein kriittinen päivämäärä Unix-ajan kannalta on 19. tammikuuta 2038 klo 03:14:08 UTC, jolloin 1. tammikuuta 1970 jälkeen kuluneiden sekuntien lukumäärää laskevan tyyppisen muuttujan arvo saavuttaa arvon 2 31 , mikä voi johtaa virheelliseen tulkintaan tämä luku negatiiviseksi . Tähän päivämäärään liittyvää riskikokonaisuutta on kutsuttu vuoden 2038 ongelmaksi . Mahdollinen ratkaisu tähän ongelmaan on käyttää ei 32- bittistä , vaan 64-bittistä muuttujaa ajan tallentamiseen (mitä tehdään kaikissa nykyaikaisissa 64-bittisissä käyttöjärjestelmissä), tämä riittää 292 miljardiksi vuodeksi [4] . time_t
Applen 64-bittisissä iOS - laitteissa on ongelma Unix-järjestelmänä: jos asetat kellonajan 64-bittisessä iOS-laitteessa yhteen aamulla 1. tammikuuta 1970 ja käynnistät laitteen uudelleen ollessasi UTC-aikavyöhykkeellä + 1:30 ja enemmän, sitten laitteen uudelleenkäynnistyksen jälkeen se ei käynnisty, Apple-logo näkyy jatkuvasti näytöllä. Tämä johtuu aikavyöhykkeiden eroista, toisin sanoen: jos käännät ajan 1:00:ksi 1. tammikuuta 1970 UTC +1:30 -aikavyöhykkeellä tai enemmän, Unix-aikalaskuri menee miinukseen, joka järjestelmä ei pysty ymmärtämään , koska lähtölaskenta on UTC:stä, minkä seurauksena laite jäätyy. Laitetta ei palauteta DFU:n kautta, mutta ongelmalla on kaksi ratkaisua muulla tavalla. Ensimmäinen tapa: odota, kunnes puhelimen akku tyhjenee kokonaan ja itse laskuri nollautuu. Toinen tapa: pura laite ja irrota akku hetkeksi, kokoa laite sitten uudelleen, myös laskuri nollautuu ja laite toimii.
Ongelma on vihdoin ratkaistu iOS 9.3.1:ssä [5] - nyt on mahdollista asettaa päivämäärä laitteeseen 1.1.2001 alkaen.