Unix-tijd en de ISO 8601-notatie
Eenheid buiten het SI · grootheid: een tijdstip als geheel aantal seconden sinds 1970
Op negentien januari 2038 zal om drie uur veertien minuten en zeven seconden wereldtijd een tweeëndertig bits brede secondenteller de waarde 2 147 483 647 bereiken — het grootste getal dat hij bevatten kan. De volgende tik heft de hoogste bit, en hetzelfde binaire woord wordt voortaan als negatief gelezen: klokken die de tijd naar juist deze telling bijhouden, belanden niet in 2038 maar in december 1901. Een curiositeit uit een verre toekomst is dat niet — een industriële regelaar of een watermeter dient langer dan de twaalf jaar die resteren.
De telling is uiterst eenvoudig opgezet: de seconden lopen achtereen vanaf middernacht op één januari 1970, en een dag bevat daarin altijd precies 86 400 seconden. Juist die eenvoud is de bron van beide eigenaardigheden. Enerzijds volgt uit het getal ogenblikkelijk een kalenderdatum en omgekeerd, zodat elk gebeurtenissenlogboek, elke database en elk bestandssysteem de tijd daarmee bijhoudt. Anderzijds valt een schrikkelseconde in zo'n telling helemaal niet uit te drukken, wat betekent dat zij haar naam ten spijt geen seconden nummert maar dagen met breuken, en in werkelijkheid een lineaire functie van de UTC-notatie is en geen teller van verstreken tijd.
01 · Definitie
De Unix-tijd is het aantal seconden dat verstreken is sinds middernacht op één januari 1970 gecoördineerde wereldtijd, in de veronderstelling dat elke dag precies 86 400 seconden telt. De ISO 8601-notatie zegt hetzelfde anders: met kalenderdatum, tijd van de dag en een opgave van de afwijking van de nulmeridiaan, waarbij de velden strikt van grof naar fijn lopen.
Het voorbehoud van 86 400 seconden is geen kleinigheid maar het wezenlijkste in de definitie. Een schrikkelseconde, aangekondigd door de dienst voor de aardrotatie, kan de telling niet opnemen, en daarom herhaalt het systeem op het ogenblik van invoeging ofwel één en dezelfde waarde tweemaal, ofwel het zet de klok terug. Daaruit volgt iets belangrijks: het verschil van twee unix-getallen is niet het aantal seconden dat tussen twee gebeurtenissen werkelijk verstreken is als daartussen een schrikkelseconde viel — de afwijking van de atoomtijdschaal is al opgelopen tot zevenentwintig seconden.
De grens hangt daarentegen niet van de definitie af maar van de breedte van de opslag. Tweeëndertig bits met teken geven als grootste waarde 2 147 483 647, die valt op negentien januari 2038; de volgende ophoging zet het hoogste bit op één en maakt het getal negatief, waarmee de klok wordt teruggeworpen naar dertien december 1901. Vierenzestig bits schuiven de grens tweehonderdtweeënnegentig miljard jaar vooruit, maar hele nanoseconden in diezelfde vierenzestig bits raken al in 2262 op.
De notatie volgens de norm lost een andere taak op — uitwisseling in plaats van opslag — en daarom tellen daarin dingen die het getal in het geheel niet heeft: de tijdzone, het scheidingsteken tussen datum en tijd, en de regel dat bij gelijke tekenlengte de lexicografische volgorde samenvalt met de chronologische. Juist die laatste eigenschap heeft het formaat tot grondslag van de sortering in bestandsnamen en logboeken gemaakt.
Voer de tijd met de schuif en zie het register vollopen: de bits lichten van rechts naar links op, en zolang de hoogste, de tekenbit, donker blijft is het getal positief en groeit de datum. Zodra de teller voorbij 2 147 483 647 stapt vlamt het hoogste bit rood op, wordt het hele getal negatief, en springt de klok naar 1901.
De groene rechte lijn is de atoomtijdschaal, waarop elke seconde werkelijk een seconde is. De rode trapvormige lijn is de Unix-tijd, die bij elke invoeging één en dezelfde tijdstempel tweemaal afgeeft, waardoor de lijn ter plaatse stilvalt. De afwijking bedraagt al zevenentwintig seconden en groeit, en daarom deugt de telling voor een kalenderdatum maar niet voor het meten van tijdsduren in de natuurkunde.
02 · Omrekening
Voer een tijdstempel of datum in
Tussen alle veelvouden van de telling — seconden, milliseconden, micro- en nanoseconden — zijn de omrekeningen exact, aangezien zij slechts door een factor verschillen. Bij benadering is één regel: de omrekening naar de atoomtijdschaal vereist te weten hoeveel schrikkelseconden er tot het gegeven ogenblik zijn opgelopen.
Het ontleden van een normtekenreeks doet het blad in de uitgebreide notatie met de letter Z; de basisvorm zonder scheidingstekens staat in de fijne instellingen.
Het jaar-2038-probleem ligt niet in de norm maar in de hardware en in oude code: tweeëndertig bits brede tijdstempels zitten in de firmware van meters, in industriële regelaars, in bestandssysteemformaten en in databases waar het veld al met vier bytes verklaard is. Het type in de bronnen wijzigen is eenvoudig genoeg; miljoenen geïnstalleerde apparaten in de resterende twaalf jaar doorlopen is een opgave van dezelfde aard als die vóór het jaar 2000.
| Waarde | Toelichting | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · Ordes van grootte
logaritmische schaal: van één seconde tot de grens van vierenzestig bits04 · Meetinstrumenten
Waarmee een gebeurtenis wordt gestempeld
Een aparte chip met batterij die de telling bijhoudt zolang het apparaat uitstaat. Hij bewaart doorgaans geen Unix-tijdstempel maar de kalendervelden afzonderlijk, en de breedte van zijn jaarveld is de zijne, zodat bij oude printen het gesprek over 2038 begint met de vraag tot welk jaar de chip zelf telt.
Het NTP-protocol brengt de klok van een machine tot op enkele milliseconden op de gemeenschappelijke tijd, en het waarschuwt ook met een eigen vlag een dag van tevoren voor een invoeging. Het heeft ook een eigen grens, en die komt eerder: er wordt geteld vanaf 1900 in ongetekende tweeëndertig bits, en de overloop valt in februari 2036.
In een logboek wordt de tijdstempel ofwel als getal ofwel als tekenreeks volgens de norm geschreven, en het tweede verdient om precies één reden de voorkeur: bij tekenreeksen van gelijke lengte valt de alfabetische volgorde samen met de chronologische, zodat de regels sorteren zonder de datum te ontleden. Juist daarom heeft het formaat zich ver buiten de rekentechniek verbreid.
De gereedheid van een apparaat voor 2038 valt op één enkele manier te beproeven — zet de klok erop voorbij de noodlottige grens en zie wat er van de logboeken, de certificaten en de intervalrekening wordt. Zo zijn al storingen gevonden in facturering, in toegangssystemen en in geldigheidsduren van sleutels, waar een datum in de toekomst door optelling ontstaat en lang vóór de grens zelf overloopt.
05 · Schrijfregels
Van grof naar fijn, en altijd met tijdzone
De norm eist aflopende volgorde van de velden, vier cijfers van het jaar, het koppelteken als datumscheider en de letter T vóór de tijd; de tijdzone wordt opgegeven ofwel met de letter Z voor de nulmeridiaan, ofwel als plus-minus uren en minuten. Een Unix-tijdstempel wordt als geheel getal zonder cijfergroepering geschreven, en het veelvoud moet altijd worden vermeld, aangezien een factor duizend seconden van milliseconden scheidt en beide naar de grootte van het getal licht te verwarren zijn.
De eerste notatie wordt in verschillende landen verschillend gelezen en is daarom in gegevensuitwisseling ontoelaatbaar. De tweede laat zowel het scheidingsteken als de tijdzone weg, zodat het tijdstip een dag naar beide kanten onbepaald blijft. De derde verliest de voorloopnullen, waardoor de tekenreeksen niet langer alfabetisch sorteren — en juist om die eigenschap wordt het formaat gewaardeerd. De vierde stelt de unix-telling gelijk aan de atoomtijdschaal, terwijl daartussen zevenentwintig seconden aan opgelopen schrikkelseconden liggen.
06 · Naburige eenheden
Daarnaast staan alle tellingen die naar hetzelfde beginsel zijn gebouwd, maar vanaf een ander begin: de NTP-tijd vanaf 1900, de Juliaanse datum vanaf de middag van het jaar 4713 vóór onze jaartelling, de schaal van het satellietsysteem vanaf januari 1980. Zij verschillen alleen in epoch en eenheid, en worden daarom omgerekend door een constante af te trekken.
getekende seconden
de grens valt al in 2036
schrikkelseconden eerlijk meegeteld
Van de fiches van Simetrium staan ernaast de Juliaanse datum, waaraan de omrekenconstante is ontleend, de schalen UTC, TAI en UT1, die de ontbrekende schrikkelseconden verklaren, seconde als eenheid van de telling, en de bit, waarvan de breedte de grens vastlegt.
07 · Historisch deel
Een epoch gekozen uit bitgebrek
In de eerste Unix-handleiding werd de tijd geteld in zestigsten van een seconde vanaf het begin van 1971, en in tweeëndertig bits bevatte zo'n telling maar ruim twee jaar. Die raakten zo snel op dat het epoch bij elke uitgave van het systeem verschoven had moeten worden, en men gaf de fracties van een seconde op ten gunste van hele.
Met de overgang naar hele seconden wonnen de ontwikkelaars een voorraad van honderdzesendertig jaar en konden zij het begin naar gemak kiezen in plaats van uit nood. Men nam één januari 1970 — de dichtstbijzijnde ronde datum in het verleden, waartoe machineregistraties toch niet reikten — en heeft die sindsdien geen enkele keer gewijzigd, hoewel het systeem meer dan eens geheel opnieuw is geschreven.
De Internationale Organisatie voor Normalisatie bracht de uiteenlopende nationale formaten tot één en legde er een eenvoudige regel aan ten grondslag: de velden lopen van grof naar fijn, alle met voorloopnullen. Het neveneffect bleek belangrijker dan de opzet — zulke tekenreeksen sorteren als getallen, en het formaat verbreidde zich in bestandsnamen, logboeken en uitwisselingsprotocollen.
Werkstation- en serversystemen zijn allang op vierenzestig bits overgegaan, en daar is de grens voorbij elke redelijke horizon geschoven. Het gevaar is elders gebleven: in de firmware van instrumenten met een levensduur van twintig jaar, in bestandsformaten waar het veld met vier bytes verklaard is, en in berekeningen van toekomstige termijnen, die vandaag al overlopen zodra men bij de huidige datum vijftien jaar optelt.
Een telling die haar naam ten spijt geen seconden telt
De definitie van de Unix-tijd klinkt als een telling van seconden, maar de eis van gladde 86 400 seconden per dag maakt haar tot iets anders: tot een lineaire functie van de UTC-notatie en niet tot een maat van verstreken tijd. Telkens wanneer de dienst voor de aardrotatie een invoeging aankondigt, moet de telling één en dezelfde waarde tweemaal herhalen of terugspringen, en het verschil van twee tijdstempels verliest juist die seconde. In een halve eeuw zijn zevenentwintig van zulke verliezen samengekomen, en daarom neemt men bij opgaven die een echte tijdsduur vereisen de atoomtijdschaal en niet deze.
De tweede eigenaardigheid ligt in het geheel niet in de definitie maar in de wijze van opslag, en dat maakt haar tot de enige grens in onze catalogus die noch door de natuur noch bij afspraak is gesteld, maar door de breedte van een machinewoord. De Juliaanse datum eindigt nooit, omdat zij een getal is; de Unix-tijd eindigt op negentien januari 2038, omdat zij een veld van vier bytes is. Het verschil tussen een grootheid en haar voorstelling houdt metrologen doorgaans weinig bezig, en hier beslist juist dat alles.
Catalogus · meeteenheden
Een fiche voor elke grootheid
Zeven SI-basiseenheden, tweeëntwintig afgeleide met een eigen naam en grootheden buiten het stelsel waarzonder techniek noch kalender zouden werken.