Tidszons-hantering i el-data
CET/CEST, UTC, sommartid och varför 25 timmar finns en gång om året.
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.