Vad är en Unix-tidsstämpel? Guide med räkneexempel
En Unix-tidsstämpel är antalet sekunder som har gått sedan 1 januari 1970 kl. 00:00:00 UTC, en tidpunkt som kallas Unix-epoken. Det är ett enda heltal, till exempel 1700000000, som representerar en exakt tidpunkt utan separata fält för datum, klockslag eller tidszon.
Vad en Unix-tidsstämpel egentligen är
Varje Unix-tidsstämpel räknar förflutna sekunder från samma fasta startpunkt: midnatt UTC den 1 januari 1970. Den tidpunkten är sekund 0. En timme senare är det 3600. Ett dygn senare är det 86400. Det finns ingen månad, dag eller timme inbakad i själva talet, bara en löpande räknare.
Datorer föredrar det här formatet av några praktiska skäl. Ett heltal är betydligt mer kompakt än en formaterad textsträng som 2023-11-14T22:13:20Z, och det är trivialt att jämföra, sortera eller räkna med. Att avgöra om en händelse inträffade före en annan blir en fråga om att jämföra två heltal, inte att tolka två textsträngar och resonera om kalendrar. Att lägga till “7 dagar” på en tidsstämpel är bara att addera 604800 (7 × 86400) till ett tal, ingen logik för skottår eller olika månadslängder krävs. Och eftersom räkningen är förankrad i UTC betyder en tidsstämpel samma exakta ögonblick överallt på jorden, oavsett vilken tidszon som skapade den eller vilken tidszon som läser av den. Det är precis därför en created_at-kolumn i en databas, ett cron-schema eller ett exp-fält i en JWT så ofta lagrar ett rent heltal istället för ett formaterat datum.
Räkneexempel: att läsa verkliga tidsstämpelvärden
Här är fem tidsstämpelvärden och det UTC-datum och den UTC-tid var och en av dem motsvarar:
| Unix-tidsstämpel (sekunder) | Datum och tid, UTC |
|---|---|
| 0 | 1 januari 1970, kl. 00:00:00 UTC (själva epoken) |
| 1000000000 | 9 september 2001, kl. 01:46:40 UTC |
| 1700000000 | 14 november 2023, kl. 22:13:20 UTC |
| 2000000000 | 18 maj 2033, kl. 03:33:20 UTC |
| 2147483647 | 19 januari 2038, kl. 03:14:07 UTC |
Ta 1700000000 som exempel på hur de här värdena hänger ihop. En miljard sekunder efter epoken hamnar man i september 2001. Ytterligare 700 miljoner sekunder, ungefär 22 år till, tar en fram till november 2023. Man behöver inte göra den divisionen för hand för att lita på tabellen, men det är en användbar tumregel: varje steg om 1 000 000 000 sekunder motsvarar ungefär 31,7 år, så ser man en tidsstämpel och vill ha en snabb känsla för vilket år det rör sig om, ger den divisionen en bra utgångspunkt innan man behöver ett verktyg.
Den sista raden är värd att minnas för sig själv: 2147483647 är det högsta värde ett 32-bitars signerat heltal kan hålla, och det landar den 19 januari 2038. Mer om varför det spelar roll längre ner.
Sekunder eller millisekunder? Så skiljer du dem åt
Det här är det absolut vanligaste misstaget med Unix-tidsstämplar, och det är lätt att upptäcka så fort man känner till knepet: räkna siffrorna. En tidsstämpel i sekunder har 10 siffror i dag, som 1700000000. Samma ögonblick i millisekunder har 13 siffror, 1700000000000, tre extra nollor eftersom en millisekund är en tusendels sekund.
De två konventionerna lever sida vid sida eftersom olika verktyg använder olika enheter som standard. JavaScripts Date.now() och de flesta webbläsar- och Node.js-API:er returnerar millisekunder. Unix-systemanrop, cron, loggfiler och det mesta av kommandoradsverktyg och serverkod använder sekunder. Klistrar man in ett millisekundvärde i ett fält som förväntar sig sekunder multipliceras det avsedda datumet med 1000, och man hamnar någonstans runt år 55000, långt bortom vad någon datumväljare klarar av att visa rimligt. Det omvända misstaget, att tolka sekunder som millisekunder, gör motsatsen: det pressar ihop ett verkligt datum till någon gång i 1970. Ser det omvandlade datumet uppenbart fel ut, långt i framtiden eller fastnaglat nära epoken, är antalet siffror det första man bör kontrollera.
Omvandla en tidsstämpel till ett datum
Stirrar man på ett rått heltal i ett API-svar eller en loggrad och behöver veta vad det faktiskt betyder, klistrar man in det nedan. Verktyget hanterar både sekund- och millisekundvärden automatiskt.
Omvandla ett datum till en tidsstämpel
Det omvända behovet är precis lika vanligt: man har valt ett specifikt datum och klockslag, kanske för att schemalägga ett cron-jobb eller sätta ett utgångsdatum, och behöver tidsstämpeln för att skicka in i ett API eller en konfigurationsfil.
Vanliga misstag och specialfall
Att blanda ihop sekunder och millisekunder. Det här är felet som beskrivs ovan, men det är värt att upprepa hur ofta det dyker upp: en tidsstämpel som plötsligt visar ett datum decennier bort, i endera riktningen, är nästan alltid ett tecken på att fel enhet har antagits någonstans i kedjan. Kontrollera alltid siffrornas antal innan man litar på ett konverterat resultat.
År 2038-problemet. System som lagrar en Unix-tidsstämpel som ett 32-bitars signerat heltal klarar bara värden upp till 2147483647, vilket motsvarar den 19 januari 2038 kl. 03:14:07 UTC. Går man förbi det värdet svämmar räknaren över och blir ett negativt tal, vilket får datumlogiken att bryta ihop på oväntade sätt, ungefär som år 2000-problemet fast med en annan orsak. Moderna system som lagrar tidsstämpeln som ett 64-bitars heltal har inte den här begränsningen; gränsen flyttas då så långt bort i framtiden att den är praktiskt taget irrelevant.
Förvirring kring tidszoner. En Unix-tidsstämpel har i sig själv ingen tidszon, den är ett absolut ögonblick, samma punkt i tiden oavsett var på jorden man befinner sig. Förvirringen uppstår när man ska visa den. Två personer i olika tidszoner som tittar på exakt samma tidsstämpel ser olika klockslag på sina skärmar, men det rör sig fortfarande om samma ögonblick. En loggrad med tidsstämpeln 1700000000 betyder samma sak för en utvecklare i Stockholm som för en i Tokyo, det är bara hur klockslaget presenteras för var och en av dem som skiljer sig åt.
Negativa tidsstämplar. Datum före den 1 januari 1970 representeras av negativa tal. -86400 motsvarar till exempel den 31 december 1969, exakt ett dygn före epoken. Långt ifrån alla system och verktyg stödjer negativa värden, så ett historiskt datum som ska omvandlas kan behöva ett dedikerat datumbibliotek istället för en enkel tidsstämpelomvandlare.
Vanliga frågor
Vad är en Unix-tidsstämpel? En Unix-tidsstämpel är det totala antalet sekunder (eller millisekunder) som har gått sedan Unix-epoken: 1 januari 1970, kl. 00:00:00 UTC. Den används universellt inom programmering för att representera en exakt tidpunkt utan tvetydighet kring tidszoner.
Hur vet jag om min tidsstämpel är i sekunder eller millisekunder?
Räkna siffrorna. En tidsstämpel i sekunder har i dag 10 siffror, till exempel 1700000000. Samma ögonblick i millisekunder har 13 siffror, 1700000000000. Om värdet är större än ungefär 10 miljarder rör det sig nästan alltid om millisekunder.
Vad är år 2038-problemet?
Det är gränsen som uppstår när en Unix-tidsstämpel lagras som ett 32-bitars signerat heltal. Den 19 januari 2038 kl. 03:14:07 UTC når räknaren sitt maxvärde, 2147483647, och svämmar över till ett negativt tal på äldre system, vilket kan få datumberäkningar att sluta fungera korrekt. Moderna 64-bitars system har ingen sådan begränsning.
Kan jag omvandla ett datum före 1970?
Ja, tekniskt sett representeras sådana datum av negativa tidsstämplar. -86400 är den 31 december 1969. Alla verktyg och system stödjer däremot inte negativa värden, så det är värt att kontrollera vad det specifika systemet man arbetar mot faktiskt accepterar.
Varför lagrar databaser datum som Unix-tidsstämplar istället för en datumsträng? Ett heltal tar mindre plats, går snabbare att jämföra, sortera och räkna med, och det är entydigt oavsett tidszon. Att avgöra vilken av två rader som skapades först blir en enkel numerisk jämförelse istället för att tolka och jämföra textformaterade datum, och att lägga till eller dra ifrån tid blir ren aritmetik utan kalenderlogik inblandad.