🕐
← Terug naar handleidingen

Unix-tijdstempel en tijdzoneconversie: een praktische gids

· Tags: timezone, dst, utc, time-conversion, unix-timestamp, daylight-saving, epoch

Waarom tijdzones ertoe doen voor Unix-tijdstempels

Unix-tijdstempels zelf zijn tijdzone-agnostisch — het getal 1785292800 betekent overal hetzelfde moment. De complexiteit ontstaat wanneer je dat moment converteert naar een leesbare lokale tijd voor weergave, logging of gegevensanalyse.

Het kernprincipe: sla altijd op in UTC, converteer alleen voor weergave. Deze regel elimineert hele categorieën bugs en maakt je gegevens draagbaar over tijdzones heen.

UTC versus lokale tijd: het verschil begrijpen

UTC (Gecoördineerde Universele Tijd)

UTC is de primaire tijdstandaard. Het verandert nooit voor zomertijd en is overal op aarde hetzelfde. Unix-tijdstempels zijn gedefinieerd in UTC.

Lokale tijd

Lokale tijd is UTC aangepast voor een specifieke geografische regio. Het kan van UTC verschillen met een vaste offset (bijv. UTC+8 voor Chinese Standaardtijd) of een variabele offset (bijv. Eastern Time schakelt tussen UTC-5 en UTC-4 voor zomertijd).

Het offsetprobleem

Hetzelfde Unix-tijdstempel produceert verschillende lokale tijden afhankelijk van de locatie van de waarnemer:

| Tijdstempel | UTC | New York (EST) | Tokio (JST) | Londen (BST) | |-----------|-----|----------------|-------------|--------------| | 1785292800 | 2026-07-19 00:00 | 2026-07-18 20:00 | 2026-07-19 09:00 | 2026-07-19 01:00 | | 1785379200 | 2026-07-19 23:59 | 2026-07-19 19:59 | 2026-07-20 08:59 | 2026-07-20 00:59 |

Zomertijd (DST)

Wat is zomertijd?

Zomertijd is de praktijk om klokken in de zomermaanden vooruit te zetten, zodat het avondlicht langer duurt. Klokken "springen vooruit" (verliezen één uur) in de lente en "vallen terug" (winnen één uur) in de herfst.

De impact op tijdstempelconversie

Zomertijd creëert een variabele offset tussen lokale tijd en UTC. Dit betekent:

  1. Dezelfde lokale tijd kan overeenkomen met twee verschillende tijdstempels (tijdens de "fall back"-overgang komt het uur 1:00 AM tweemaal voor)
  2. Sommige lokale tijden bestaan niet (tijdens de "spring forward"-overgang, bijv. 2:00 AM gebeurt nooit — klokken springen direct naar 3:00 AM)

Voorbeeld: het dubbelzinnige uur

In de Eastern Time-zone van de Verenigde Staten vallen klokken op de eerste zondag van november om 2:00 AM terug naar 1:00 AM. Dit betekent:

from datetime import datetime, timezone
import pytz

eastern = pytz.timezone("America/New_York")

# First occurrence of 1:00 AM (EDT, UTC-4)
first = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=True)
print(first.timestamp())
# Some timestamp value

# Second occurrence of 1:00 AM (EST, UTC-5) = 3600 seconds later!
second = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=False)
print(second.timestamp())
# first.timestamp() + 3600

Ga in je toepassingen altijd zorgvuldig om met het dubbelzinnige terugval-uur. Het gebruik van is_dst/ambiguous-vlaggen in Python of gelijkwaardige opties in andere talen voorkomt subtiele bugs.

Converteren over tijdzones heen

Onze online tool gebruiken

De eenvoudigste benadering voor eenmalige conversies is onze Unix-tijdstempelconverter, die resultaten in meerdere tijdzones tegelijk toont.

De Linux-opdrachtregel gebruiken

# Display timestamp in multiple timezones
TZ="America/New_York" date -d @1785292800
TZ="Europe/London"    date -d @1785292800
TZ="Asia/Tokyo"       date -d @1785292800

# With custom ISO format
TZ="UTC" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 00:00:00 UTC

TZ="Asia/Shanghai" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 08:00:00 CST

Python gebruiken

from datetime import datetime
from zoneinfo import ZoneInfo  # Python 3.9+

ts = 1785292800

# Convert to multiple timezones
timezones = ["America/New_York", "Europe/London", "Asia/Tokyo", "Australia/Sydney"]

for tz_name in timezones:
    tz = ZoneInfo(tz_name)
    dt = datetime.fromtimestamp(ts, tz=tz)
    print(f"{tz_name}: {dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")

JavaScript gebruiken

const ts = 1785292800;
const date = new Date(ts * 1000);

const timezones = [
    "America/New_York",
    "Europe/London",
    "Asia/Tokyo",
    "Australia/Sydney"
];

for (const tz of timezones) {
    const str = date.toLocaleString("en-US", {
        timeZone: tz,
        timeZoneName: "short",
    });
    console.log(`${tz}: ${str}`);
}

Go gebruiken

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Unix(1785292800, 0)
    
    timezones := []string{
        "America/New_York",
        "Europe/London",
        "Asia/Tokyo",
        "Australia/Sydney",
    }
    
    for _, tz := range timezones {
        loc, _ := time.LoadLocation(tz)
        fmt.Printf("%s: %s\n", tz, t.In(loc).Format("2006-01-02 15:04:05"))
    }
}

Veelvoorkomende tijdzoneconversiepatronen

Serverlogs converteren naar lokale tijd

Serverlogs registreren tijdstempels doorgaans in UTC. Converteer ze bij het analyseren naar je lokale tijdzone:

# Read a log file and display timestamps in Pacific time
while IFS= read -r line; do
    if [[ $line =~ ^([0-9]+) ]]; then
        ts="${BASH_REMATCH[1]}"
        TZ="America/Los_Angeles" date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
        echo " $line"
    fi
done < server.log

Gebeurtenissen over tijdzones heen plannen

Wanneer je gebeurtenistijden deelt over tijdzones heen, communiceer dan altijd in UTC of deel het Unix-tijdstempel rechtstreeks. Dit elimineert dubbelzinnigheid:

  • "Vergadering om 1785292800" is ondubbelzinnig
  • "Vergadering om 9:00 AM EST" wordt dubbelzinnig tijdens zomertijdovergangen
  • "Vergadering om 9:00 AM America/New_York" is beter, maar vereist nog steeds dat je de zomertijdstatus kent

Tijdstempels opslaan in databases

-- Always store the timestamp itself (timezone-independent)
INSERT INTO events (occurred_at, user_id) VALUES (1785292800, 42);

-- OR store with an explicit UTC timestamp column
INSERT INTO events (occurred_at_utc, user_id) 
VALUES ('2026-07-19 00:00:00+00', 42);

Samenvatting van beste praktijken

  1. Sla op in UTC, converteer voor weergave — Sla lokale tijd nooit op in databases
  2. Gebruik IANA-tijdzonesnamen (bijv. America/New_York) in plaats van afkortingen (EST, PST) — afkortingen zijn dubbelzinnig en houden geen rekening met zomertijd
  3. Ga expliciet om met zomertijd — Gebruik tijdzonebewuste bibliotheken; tel nooit handmatig uren op of af
  4. Geef altijd tijdzone-informatie door — Wanneer je datums van gebruikers accepteert, verzamel dan de tijdzone, niet alleen de offset
  5. Test randdatums — Test je conversielogica op zomertijdovergangsdatums (zowel lente als herfst) om bugs vroeg te ontdekken

Tijdzonedatabase

De tijdzonegegevens van je systeem komen uit de IANA Time Zone Database (ook wel de Olson-database genoemd), die meerdere keren per jaar wordt bijgewerkt naarmate overheden zomertijdregels wijzigen. Houd je systeem up-to-date:

# Debian / Ubuntu
sudo apt update && sudo apt install tzdata

# macOS
# Automatically updated via software updates

# Verify your database version
zdump -v /etc/localtime | head -1

Gebruik onze Unix-tijdstempelconverter voor snelle tijdzonebewuste conversies in alle grote tijdzones.