Unix-timestamp omzetten

Plak het getal en kom erachter welk moment het aanwijst. Of het seconden of milliseconden zijn wordt zelf herkend en er wordt bij gezegd welke er is gebruikt, want in stilte goed gokken is wat een fout van duizend in een raadsel verandert. Je krijgt UTC, je eigen tijd, ISO 8601 en hoelang geleden — vier antwoorden, omdat de vraag zelden maar één ding is.

De herkenning zit er vrijwel altijd goed in, en het antwoord zegt welke eenheid het heeft gebruikt.

Resultaat

Het antwoord verschijnt hier terwijl je typt.

  • Waar het draait

    Er wordt niets geüpload, want er is geen bestand — het wordt in deze pagina uitgerekend.

  • Geen wachtrij, geen account

    Het antwoordt zo snel als je machine kan, en vraagt nooit wie je bent.

  • Zo vaak als je wilt

    Er wordt niets geteld en niets begrensd — nog eens antwoorden kost ons niets.

Hoe het werkt

  1. Plak de timestamp.
  2. Laat het op automatisch herkennen staan, tenzij je weet dat het getal misleidend is.
  3. Lees de datum in UTC en in je eigen tijd. Er is niets geüpload.

Tien cijfers of dertien

Een Unix-timestamp telt vanaf 1 januari 1970. In seconden hebben hedendaagse data tien cijfers, in milliseconden dertien. Dat verschil in grootte is wat toelaat de eenheid af te leiden zonder ernaar te vragen, en de grens ligt ver van elke datum waar iemand naar kijkt.

De afleiding wordt altijd genoemd, want de klassieke fout bij deze omzetting is in stilte goed gokken. Een getal in milliseconden dat als seconden wordt gelezen levert een datum in het jaar 55.000 op en dat valt op; andersom kom je in 1970 uit en dat valt ook op. Wat niet opvalt is een hulpmiddel dat zelf besluit en het niet vertelt.

UTC en lokale tijd zijn geen presentatiedetail

Het getal draagt geen tijdzone: het is een absoluut moment. De zone komt er pas bij als je het als datum opschrijft, en daar komt het duurste misverstand van deze omzetting vandaan — twee mensen die naar dezelfde timestamp kijken en verschillende dagen lezen omdat ze in verschillende zones zitten.

Daarom komen ze allebei. In Nederland is het verschil met UTC één uur in de winter en twee in de zomer, dus een gebeurtenis van 23:30 UTC valt in Amsterdam al op de volgende dag. Wordt een logregel naast een dashboard gelegd, dan is de helft van de afwijkingen precies dit.

De zomertijd die rapportages scheeftrekt

De lokale tijd wordt berekend met de regels van jouw zone op die concrete datum, niet met die van vandaag. Dat telt, want door de zomertijd bestaat er in de nacht van de laatste zondag van oktober een uur dat twee keer voorkomt, en in die van maart een uur dat helemaal niet bestaat.

Een rapportage die per lokaal uur groepeert heeft daardoor in oktober een dubbele bak en in maart een lege. Dat is geen fout in de rapportage: het is dat lokale tijd geen rechte lijn is. Systemen die in UTC bewaren en pas bij het tonen omrekenen ontlopen dit; systemen die lokaal bewaren niet.

Waarom de telling in 1970 begint

Het nulpunt is 1 januari 1970 om middernacht UTC, en dat is geen diepzinnige keuze: de bouwers van Unix hadden een recent, rond beginpunt nodig dat in de tellers van die machines paste. Het is blijven staan omdat alles eromheen erop is gebouwd.

Het gevolg is dat het getal niets over kalenders weet. Schrikkeljaren, maandlengtes en tijdzones zijn allemaal interpretatie die pas bij het opschrijven wordt toegepast. Daarom is een timestamp uitstekend om mee te rekenen en ongeschikt om aan een mens te tonen, en daarom bestaat deze pagina.

Negatieve getallen, en data vóór 1970

Een negatieve timestamp is geldig en wijst een moment vóór 1970 aan: `-86400` is 31 december 1969. Ze komen voor in geboortedata, in historische archieven en in gegevens die uit een systeem komen dat met een andere jaartelling begon en is omgerekend.

Veel software gaat er niet goed mee om. Oude bibliotheken en sommige databasekolommen nemen aan dat een timestamp niet negatief kan zijn, en leveren dan een datum in 2106 of een fout. Zie je bij historische gegevens onmogelijke jaartallen, dan is een negatief getal dat ergens als niet-negatief is gelezen de gebruikelijke oorzaak.

Het jaar 2038

Een timestamp die in een 32-bits geheel getal met teken wordt bewaard, loopt op 19 januari 2038 over en springt naar 1901. Dat klinkt ver weg en is het niet meer: elke berekening die twintig jaar vooruitkijkt — een hypotheek, een certificaat, een aflossingsschema — steekt die grens vandaag al over.

Moderne systemen gebruiken 64 bits en hebben het probleem niet. Wat overblijft zijn oude binaire formaten, embedded systemen en databasekolommen die lang geleden zijn gedeclareerd. Het is het soort fout dat niet opduikt tot iemand een verre datum invoert, en dan opeens helemaal.

ISO 8601, en waarom het goed sorteert

De vorm `2023-11-14T22:13:20Z` is zo bedacht dat sorteren als tekst hem ook als datum sorteert. Daarom is het de vorm die je wilt in bestandsnamen, in sleutels en overal waar iets alfabetisch gaat sorteren zonder te weten dat het naar data kijkt.

De `Z` aan het eind betekent UTC. Het ontbreken ervan is een onuitputtelijke bron van fouten: een tekst zonder zone wordt door elk systeem met zijn eigen aanname gelezen, en twee diensten kunnen dezelfde tekst als twee momenten uren uit elkaar lezen. Schrijf je een datum op, schrijf dan de zone erbij.

Schrikkelseconden bestaan hier niet

Unix-tijd doet alsof elke dag exact 86.400 seconden heeft, en dat is onwaar: sinds 1972 zijn er zevenentwintig schrikkelseconden ingevoegd om de onregelmatige draaiing van de aarde bij te houden. Het formaat negeert ze eenvoudigweg.

Voor vrijwel iedereen is dat de juiste beslissing, want het houdt datumrekenwerk werkbaar. Het houdt op de juiste te zijn in de sterrenkunde, in navigatiesystemen en bij sommige wetenschappelijke metingen, waar ze echt meetellen — en daar wordt geen Unix-tijd gebruikt maar een schaal die ze wel telt.

De ISO-week en het jaar dat niet klopt

De ISO-weeknummering definieert week 1 als de week met de eerste donderdag van het jaar, en weken beginnen op maandag. Daaruit volgt dat 1 januari in week 52 van het vorige jaar kan vallen, en dat 31 december al week 1 van het volgende kan zijn.

Dat detail sloopt elk jaar in januari weekrapportages. De praktische regel is dat het jaar van de week niet altijd het jaar van de datum is, en wie per week groepeert moet ze samen bewaren — een «week 1» zonder jaar is dubbelzinnig juist in de dagen waarop er het meest naar gekeken wordt.

Hoelang geleden, en waar dat voor dient

De regel met de relatieve tijd — «drie jaar geleden», «elf minuten geleden» — voegt geen precisie toe maar schaal. Het is wat in één oogopslag antwoordt of een logregel van vanochtend is of van de uitrol van vorige maand, en dat is meestal de echte vraag achter het bekijken van een timestamp.

Hij wordt in je eigen taal geschreven met de formatter die de browser aan boord heeft, dus de vormen zijn echt Nederlands en geen vertaling van Engelse sjablonen. Voor het exacte antwoord zijn de andere regels er; deze is om je te oriënteren.

De AVG en het getal ernaast

Een timestamp reist bijna nooit alleen: hij wordt gekopieerd uit een logregel, uit een databaserij of uit een payload waar een gebruikers-id naast staat. Omdat het omzetten op de pagina gebeurt, verlaten noch het getal noch wat ernaast staat je machine.

Daar komt bij dat je tijdzone meer identificeert dan het lijkt, en hier wordt die van de browser gebruikt zonder dat hij ergens heen gaat. Het omrekenen naar lokale tijd doet je eigen apparaat, en dat is het enige dat het hoeft te weten.

Unix-timestamp omzetten: veelgestelde vragen

Hoe weet het of het seconden of milliseconden zijn?

Aan de grootte van het getal: hedendaagse data hebben tien cijfers in seconden en dertien in milliseconden. De grens ligt ver van elke redelijke datum, en het antwoord zegt altijd welke eenheid het heeft gebruikt.

Waarom komt de lokale tijd niet overeen met die in mijn logbestand?

Omdat het logbestand vrijwel zeker in UTC staat. In Nederland is het verschil één uur in de winter en twee in de zomer, dus een gebeurtenis van 23:30 UTC valt in Amsterdam al op de volgende dag.

Wat gebeurt er in 2038?

Een timestamp in een 32-bits geheel getal met teken loopt op 19 januari 2038 over en springt naar 1901. Systemen met 64 bits hebben het probleem niet; over blijven oude binaire formaten, embedded systemen en lang geleden gedeclareerde kolommen.

Waarom klopt het weeknummer niet met het jaar van de datum?

Omdat ISO-week 1 de week met de eerste donderdag van het jaar is. 1 januari kan in week 52 van het vorige jaar vallen. Wie per week groepeert moet het jaar van de week naast het nummer bewaren.

Wordt het getal ergens heen gestuurd?

Nee. Het omzetten gebeurt op deze pagina, en je tijdzone gebruikt je eigen browser zonder dat die ergens heen gaat. Een timestamp wordt bijna altijd samen met iets anders gekopieerd, en dat andere beweegt evenmin.

Andere hulpmiddelen