Tidszons-hantering i el-data

CET/CEST, UTC, sommartid och varför 25 timmar finns en gång om året.

Uppdaterad 2026-05-19

Sverige använder CET/CEST

  • CET (UTC+1) på vintern
  • CEST (UTC+2) på sommaren
  • Övergång: sista söndagen i mars (vår) och sista söndagen i oktober (höst)

Datakällor och deras tidszoner

Källa Returnerad tidszon Vår tolkning
NordPool CET/CEST (lokal Stockholm) Parsa som lokaltid + DST
eSett timestamp CET/CEST Lokal tid
eSett timestampUTC UTC UTC, alltid pålitlig
elprisetjustnu.se time_start med +01:00 / +02:00-suffix ISO 8601 med offset
EDIEL-meddelanden CET/CEST Lokal tid (alltid)

Den evighetsa frågan: 23, 24 eller 25 timmar/dygn?

På övergångsdagar:

  • Vårövergången (sista mars): dygnet har 23 timmar. Tiden hoppar från 02:00 → 03:00. Timpriser kl 02:00-03:00 SAKNAS.
  • Höstövergången (sista oktober): dygnet har 25 timmar. Tiden går 02:00 → 03:00 → 02:00. Timpriser kl 02:00-03:00 är publicerade TVÅ gånger.

Hur eSett hanterar

eSett returnerar dubbla 02:00-poster vid höstövergången, distinguished by timestampUTC:

[
  {"timestamp": "2026-10-25T02:00:00", "timestampUTC": "2026-10-25T00:00:00Z"},
  {"timestamp": "2026-10-25T02:00:00", "timestampUTC": "2026-10-25T01:00:00Z"}
]

Lösning: använd alltid timestampUTC som primary key i natomrade-DB.

Vår implementation

-- I production_volumes och electricity_prices använder vi TIMESTAMPTZ
-- som internt är UTC men presenteras i den session/connection-tidzon
CREATE TABLE production_volumes (
    time_start TIMESTAMPTZ PRIMARY KEY,
    ...
);

PostgreSQL TIMESTAMPTZ är alltid UTC internt — bara formattering ändras vid läsning. Bästa typen för tidsdata.

I Python

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# Hämta nuvarande tid i Stockholm
now_se = datetime.now(ZoneInfo("Europe/Stockholm"))

# Konvertera till UTC
now_utc = now_se.astimezone(timezone.utc)

# Parsa eSett-timestamp (utan offset, antar CET/CEST)
naive = datetime.fromisoformat("2026-05-15T02:00:00")
aware_se = naive.replace(tzinfo=ZoneInfo("Europe/Stockholm"))

I JavaScript

// "2026-05-15T02:00:00+02:00" parsas korrekt med Date()
const d = new Date("2026-05-15T02:00:00+02:00");
console.log(d.toISOString()); // → "2026-05-15T00:00:00.000Z"
console.log(d.toLocaleString("sv-SE", {timeZone: "Europe/Stockholm"}));

Vanliga buggar

Använda lokaltid utan offset i databas → tappar info vid DST ❌ Anta UTC för värden som är CET → 1-2h fel ❌ Sortera på localtime-strängar → fel ordning vid DST-övergång ❌ Jämföra epoch ms mot lokal HH:MM → mismatch på övergångsdagar

Vår regel

Allt sparas som UTC internt. Bara display-lagret renderar till svensk lokaltid.