Tid verkar enkelt tills du forssoker skriva programvara som hanterar det korrekt. En handelse planerad till "kl. 15" betyder olika saker i Tokyo, London och New York. Sommartid flyttar klockorna framat eller bakat -- men inte overallt, och inte pa samma datum. En tidsstampel som ser korrekt ut i din lokala miljo bryter i produktion for att servern ar i en annan zon.
Tidszoner ar ett av de mest palitligt forvirrande amnena inom programvaruutveckling. Den har artikeln forklarar hur de fungerar, var komplexiteten kommer ifran och hur du undviker de vanligaste misstagen.
Varfor tidszoner finns
Jorden roterar 360 grader pa 24 timmar, vilket innebar att solen star som hogst vid olika tidpunkter beroende pa din longitud. Fore 1800-talet stallde varje stad sina klockor efter lokal soltid -- middag var nar solen stod som hogst. Det fungerade bra tills jarnvagar forbband avlagsna stader och en tidtabell behovde en enda konsekvent klocka.
1884 motes delegater fran 25 nationer vid den internationella meridiankonferensen i Washington, D.C. och enades om att dela in varlden i 24 standardtidszoner, var och en med en offset fran nollmeridianen (0 graders longitud) som gar genom Greenwich, England.
I praktiken foljer tidszonsgranser politiska granser, inte snygga longitudlinjer. Kina stracker sig over fem geografiska zoner men anvander en enda officiell tid (UTC+8). Indien anvander UTC+5:30 -- en halvtimmesoffset. Nepal anvander UTC+5:45. Den verkliga kartan over tidszoner ar rorig.
UTC vs. GMT
GMT (Greenwich Mean Time) ar den genomsnittliga soltiden vid Royal Observatory i Greenwich. Det var varldens tidsreferens i over ett sekel.
UTC (Coordinated Universal Time) ersatte GMT som internationell standard 1972. UTC baseras pa atomklockor istallet for astronomisk observation, vilket gor det mycket mer precist. For de flesta praktiska andamal visar UTC och GMT samma tid, men UTC ar den korrekta tekniska referensen.
Varfor "UTC" och inte "CUT"? Forkortningen ar en kompromiss mellan engelskans "Coordinated Universal Time" (CUT) och franskans "Temps Universel Coordonne" (TUC). Ingen sida fick sin foredagna forkortning, sa UTC valdes som ett sprakneutralt alternativ.
Sommartid: organiserat kaos
Ungefar 70 lander tillaimpar sommartid (DST) och skiftar klockorna framat en timme pa varen och tillbaka pa hosten. Avsikten ar att anpassa vakna timmar efter dagsljus. Resultatet ar en halvarsvis kalla till buggar.
Viktiga komplikationer:
- Inte universellt. De flesta delar av Afrika, Asien och Sydamerika tillaimpar inte sommartid. Inom USA valjer Arizona och Hawaii bort det.
- Olika datum. EU skiftar sista sondagen i mars och oktober. USA skiftar andra sondagen i mars och forsta sondagen i november. De ar ur synk i flera veckor varje ar.
- Tvetydiga tider. Nar klockorna stalls tillbaka intraffar timmen fran 01:00 till 02:00 tva ganger. En tidsstampel pa "01:30" den dagen ar tvetydig.
- Overhoppade tider. Nar klockorna stalls fram existerar inte timmen fran 02:00 till 03:00. Ett mote planerat till 02:30 den dagen intraffar aldrig.
- Politiska andringar. Regeringar kan (och gor) andra sommartidsregler med kort varsel. Ryssland antog permanent sommartid 2011, sedan bytte till permanent normaltid 2014. Marocko har andrat sommartidsregler flera ganger.
ISO 8601: det universella datumformatet
For att undvika tvetydighet definierar den internationella standarden ISO 8601 ett tydligt datum- och tidsformat:
2026-03-29T14:30:00Z
2026-03-29T14:30:00+02:00
2026-03-29T14:30:00-05:00
Tseparerar datum fran tid.Zbetyder UTC ("Zulu"-tidszonen i militarterminologi).+02:00eller-05:00ar UTC-offseten.
Detta format ar entydigt, sorterbart som ren text och universellt forstatt av datumparsiningsbibliotek. Nar du ar osakar, anvand ISO 8601.
Unix-tidsstamplar
En Unix-tidsstampel (ocksa kallad epoch-tid eller POSIX-tid) ar antalet sekunder som har forflutit sedan 1 januari 1970, 00:00:00 UTC -- en tidpunkt kand som Unix-epoken.
| Manniskolasbar | Unix-tidsstampel |
|---|---|
| 1970-01-01 00:00:00 UTC | 0 |
| 2000-01-01 00:00:00 UTC | 946684800 |
| 2026-03-29 12:00:00 UTC | 1774987200 |
Unix-tidsstamplar har ingen tidszon -- de ar alltid i UTC. Detta gor dem idealiska for att lagra och jamfora tider i programvara. Du konverterar till en lokal tidszon bara i presentationslagret.
Ar 2038-problemet: System som lagrar Unix-tidsstamplar som ett 32-bitars signerat heltal kommer att svama over den 19 januari 2038 kl. 03:14:07 UTC. Det maximala vardet (2 147 483 647) vands till ett negativt tal, som tolkas som december 1901. De flesta moderna system anvander 64-bitars heltal, som inte svammar over pa ytterligare 292 miljarder ar.
IANA-tidszonsdatabasen
Programvara behover inte bara UTC-offset -- den behover kanna hela historiken och framtida regler for varje region, inklusive sommartidsovergongar, politiska andringar och historiska anomalier. Denna information finns i IANA-tidszonsdatabasen (ocksa kallad Olson-databasen eller tzdata).
Den anvander identifierare som America/New_York, Europe/Paris, Asia/Tokyo. Varje post kodar den kompletta historiken av UTC-offset och sommartidsregler for den platsen.
Det ar darfor du aldrig bor lagra en tidszon som en fast offset som "+02:00". En offset beratar var den aktuella skillnaden fran UTC ar men sager ingenting om sommartidsregler. Europe/Paris ar UTC+1 pa vintern och UTC+2 pa sommaren. IANA-identifieraren fangar bada.
Vanliga buggar i programvara
- Lagring av lokal tid utan tidszon. Ett varde som
2026-03-29 14:30:00ar meningslost utan att veta vilken tidszon det avsyftar. Lagra alltid UTC eller inkludera offseten. - Anta att UTC-offset ar lika med tidszon. UTC+2 i mars kan vara UTC+3 i juli (om regionen tillaimpar sommartid). Lagra IANA-identifieraren, inte offseten.
- Ignorera sommartidsovergongar i schemalagen. Ett dagligt jobb kl. 02:30 hoppar over en gang per ar och kor tva ganger en gang per ar om du inte hanterar sommartid.
- Anta att dagar har 24 timmar. Pa sommartidsovergongsdagar har en dag 23 eller 25 timmar. Att berakna "imorgon samma tid" genom att lagga till 86 400 sekunder blir en timme fel.
- Anvanda JavaScript
Datenaivt.new Date("2026-03-29")parsas som UTC i vissa motorer och som lokal tid i andra. Var alltid explicit om tidszonen.
Basta praxis for utvecklare
- Lagra tider i UTC. Konvertera till anvandarens lokala tidszon bara i presentationslagret.
- Anvand IANA-tidszonsidentifierare (
America/New_York), inte fasta offset (-05:00). - Anvand ISO 8601 for serialisering. Det ar entydigt och universellt parsbart.
- Anvand ett moget datumbibliotek. I JavaScript, anvand
Intl.DateTimeFormateller ett bibliotek somdate-fns-tz. I Python, anvandzoneinfo(3.9+) ellerpytz. I Java, anvandjava.time.ZonedDateTime. - Hall
tzdatauppdaterat. Regeringar andrar sommartidsregler. Ditt operativsystem och din sprakruntime behover aktuell tidszonsdata. - Testa med flera tidszoner. Anta inte att din server och dina anvandare delar samma zon.
Mer lasning
Tid ar bedragligt komplext, men reglerna ar valdokumenterade och verktygen ar mogna. Nyckeln ar att respektera komplexiteten snarare an att anta bort den.
- Cron-uttryck avmystifierade -- schemalagga uppgifter over tidszoner
- Hash-generator och Regex-testare -- fler utvecklarverktyg pa ToolK
