Skip to content
Terug naar blog
Tutorials

Unix timestamp omrekenen: precisie, tijdzone & DST-gids

Unix timestamps uitgelegd: epoch tijd, omrekenen van seconden/ms/μs, tijdzone-afhandeling, DST-valkuilen en codevoorbeelden in JS, Python en Go.

14 min leestijd

Volledige gids voor Unix timestamps: seconden/milliseconden/microseconden omrekenen en aanbevolen aanpak voor tijdzones

Unix timestamps drukken tijd uit als “de verstreken tijd sinds de Unix epoch (1 januari 1970, 00:00:00 UTC).” Meer dan 95% van de webservers en 90% van de databasesystemen wereldwijd gebruikt deze weergave intern. Deze gids behandelt precisieverschillen, implementaties in programmeertalen, tijdzone-afhandeling en overwegingen rond zomertijd.

Oorsprong en definitie van de Unix timestamp

De Unix epoch begon op 1 januari 1970, 00:00:00 UTC. Unix timestamp 0 correspondeert met dit moment, terwijl 1262304000 overeenkomt met 2010-01-01 00:00:00 UTC. Het systeem negeert standaard de effecten van schrikkelseconden.

Oorspronkelijk opgeslagen als 32-bits signed integers, wat leidde tot het jaar-2038-probleem — de maximale waarde loopt over op 19 januari 2038, 03:14:07 UTC. Moderne systemen gebruiken 64-bits integers, zodat er veel langere tijdperiodes kunnen worden weergegeven.

Precisieverschillen

EenheidAantal per secondeCijfersTypische toepassingen
Seconden (s)110Traditionele Unix/Linux-systemen
Milliseconden (ms)1.00013JavaScript, Java, logging
Microseconden (μs)1.000.00016Distributed tracing, databases
Nanoseconden (ns)1.000.000.00019Go-taal, prestatieanalyse

Praktische vuistregel: timestamps van 10 cijfers stellen doorgaans seconden voor, 13 cijfers milliseconden, 16 cijfers microseconden en 19 cijfers nanoseconden.

JavaScript-timestamps

JavaScript gebruikt standaard milliseconden. De Date()-constructor gaat ervan uit dat ingevoerde getallen milliseconden zijn — voor timestamps op secondeniveau vermenigvuldig je die met 1000.

// Get current Unix timestamp (in milliseconds)
const timestampMs = Date.now();
console.log(timestampMs);  // Example output: 1692268800123

// For second-level timestamps, divide milliseconds by 1000 and round down
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // Example output: 1692268800

// Convert Unix timestamp back to Date object
let ts = 1692268800;
let date = new Date(ts * 1000);
console.log(date.toISOString()); // "2023-08-17T16:00:00.000Z"

Python-timestamps

Python’s time.time() geeft timestamps op secondeniveau terug als drijvende-kommagetallen:

import time
from datetime import datetime, timezone

# Get current Unix timestamp (seconds, float)
now_sec = time.time()
print(now_sec)  # Example output: 1692268800.123456

# Get milliseconds (integer)
now_millis = int(time.time() * 1000)
print(now_millis)  # Example: 1692268800123

# Get nanoseconds (Python 3.7+)
now_nanos = time.time_ns()
print(now_nanos)  # Example: 1692268800123456789

# Convert to datetime
ts = 1692268800
dt_local = datetime.fromtimestamp(ts)
dt_utc = datetime.fromtimestamp(ts, timezone.utc)
print(dt_local.strftime("%Y-%m-%d %H:%M:%S"))  # Local time
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))    # UTC time

Go-timestamps

De time-bibliotheek van Go biedt meerdere precisieniveaus:

package main

import (
    "fmt"
    "time"
)

func main() {
    // Get current Unix timestamp
    sec := time.Now().Unix()        // Seconds
    msec := time.Now().UnixMilli()  // Milliseconds (Go 1.17+)
    nsec := time.Now().UnixNano()   // Nanoseconds

    fmt.Println(sec)   // Example: 1692268800
    fmt.Println(msec)  // Example: 1692268800123
    fmt.Println(nsec)  // Example: 1692268800123456789

    // Convert timestamp to Time object
    t := time.Unix(sec, 0)
    fmt.Println(t.UTC())
    fmt.Println(t)
}

Veelgemaakte fouten en aanbevolen aanpak

Voorbeeldfout: onduidelijke eenheden

// ✗ Fout: onduidelijke timestamp-eenheid
const timestamp = 1692268800;
const date = new Date(timestamp); // Fout: wordt als milliseconden behandeld, toont 1970

// ✓ Correct: eenheden expliciet aangeven
const timestampSec = 1692268800;
const timestampMs = 1692268800000;
const dateFromSec = new Date(timestampSec * 1000);

Aanbevolen aanpak voor veldnamen

log_entry = {
    "timestamp_ms": 1692268800123,           # Millisecond-level
    "timestamp_iso": "2023-08-17T16:00:00Z", # ISO 8601 UTC
    "event_type": "user_login",
    "user_id": 12345
}

Valkuilen bij tijdzone-afhandeling

Er zijn vier veelvoorkomende valkuilen bij het werken met tijdzones:

  1. Lokale tijd en UTC door elkaar halen — Unix timestamps zijn altijd UTC-gebaseerd; zet ze pas om naar lokale tijd bij weergave
  2. Geen tijdzone-informatie opslaan — Dit veroorzaakt dubbelzinnigheid; sla altijd UTC op of voeg de offset toe
  3. Tijdzone-inconsistenties tussen systemen — Alle systemen moeten dezelfde tijdzonestandaard gebruiken (aanbevolen: UTC)
  4. Handmatig DST-offsets berekenen — Vertrouw op ingebouwde bibliotheken, niet op hardgecodeerde waarden

De aanbevolen aanpak: sla altijd op in UTC, geef weer in lokale tijd. Gebruik UTC of Unix timestamps bij opslag en overdracht om consistentie te garanderen; formatteer op basis van de tijdzone van de gebruiker bij weergave.

Zomertijd (DST)

Zomertijd (DST) creëert twee problematische periodes:

  • Overgeslagen tijd: wanneer de zomertijd ingaat, gaat de klok vooruit. Zo springt 02:00 direct naar 03:00, waardoor 02:30 niet bestaat.
  • Herhaalde tijd: wanneer de zomertijd eindigt, verschijnt 01:00–01:59 twee keer, wat dubbelzinnigheid veroorzaakt.

Unix timestamps zelf blijven continu en worden niet beïnvloed door DST, maar lokale tijdconversies vereisen zorgvuldige afhandeling.

Aanbevolen aanpak voor logging, databases en API’s

Logsystemen

Gebruik een uniforme UTC-tijdzone met ISO 8601-formaat; voeg waar nodig timestamps toe op milliseconde- of microsecondenprecisie.

Databases

Geef de voorkeur aan native kalendertypen met tijdzone; gebruik BIGINT voor numerieke timestamps met een duidelijke eenheidsaanduiding in veldnamen (bijv. *_epoch_ms).

API’s

Geef formaten en eenheden expliciet op. Externe interfaces kunnen het beste ISO 8601 gebruiken (leesbaar, inclusief tijdzone); interne systemen kunnen numerieke timestamps gebruiken met gedocumenteerde eenheden.

Veelvoorkomende foutscenario’s

  • Fout bij het verwerken van 13-cijferige timestamps: milliseconde-timestamps die worden doorgegeven aan functies die seconden verwachten, veroorzaken overflow. Bepaal de eenheden eerst op basis van het aantal cijfers.
  • Onjuiste indelingen: ongeldige datums, ontbrekende tijdzones of DST-overgangspunten veroorzaken fouten bij het inlezen.
  • Tijdzone-offsets: afwijkingen van hele uren (±8 uur) wijzen doorgaans op een tijdzone-fout. Aanbevolen: UTC intern gebruiken.
  • Numerieke overflow: 32-bits systemen kampen met de 2038-limiet; geef prioriteit aan 64-bits integers.

Veelgestelde vragen

Waarom 1 januari 1970?

De ontwikkeling van het Unix-besturingssysteem begon in 1970, en het was een rond decenniumjaar — makkelijk te onthouden en te berekenen. 32-bits integers konden datums van 1970 tot 2038 weergeven, wat destijds voldoende was.

Hoe onderscheid je seconden van milliseconden?

Drie methoden: controleer het aantal cijfers (10 cijfers = seconden, 13 = milliseconden, 16 = microseconden, 19 = nanoseconden), verifieer door te verwerken en te controleren of de uitkomst redelijk is, of gebruik online conversietools.

Is het jaar-2038-probleem nog relevant?

Moderne systemen die 64-bits integers gebruiken hebben dit grotendeels opgelost. De meeste gangbare programmeertalen ondersteunen al 64-bits timestamps. Verouderde 32-bits systemen en embedded apparaten verdienen mogelijk nog aandacht.

Waarom veroorzaakt DST problemen?

Tijdsdiscontinuïteit door overgeslagen uren en tijdsherhaling door herhaalde uren zorgen voor dubbelzinnigheid bij het inlezen. Verschillende systemen hanteren verschillende strategieën voor ambigue tijden. Oplossing: gebruik UTC intern en zet pas op het moment van weergave om naar lokale tijd.

Waarom verschillen JavaScript- en Python-timestamps?

JavaScript’s Date.now() geeft milliseconden terug (13 cijfers); Python’s time.time() geeft seconden terug (drijvende komma met microsecondennauwkeurigheid). Voor conversie deel of vermenigvuldig je met 1000.

  • Hogere precisie: financiële handel, IoT en realtime systemen vereisen nauwkeurigheid op nanosecondenniveau
  • Gedistribueerde synchronisatie: NTP- en PTP-protocollen verbeteren de nauwkeurigheid
  • Blockchain-timestamps: cryptocurrency vereist fraudebestendige timestamps met hoge precisie
  • Prestatieoptimalisatie: SIMD-instructies, geheugencaching en parallelle verwerking versnellen conversies

Zelf uitproberen

Reken Unix timestamps direct om met onze Unix Timestamp Omrekenen — detecteert automatisch seconden, milliseconden en microseconden. 100% in je browser.

Werk je met PostgreSQL? Lees wat er precies in een PostgreSQL timestamp-kolom wordt opgeslagen voor meer informatie over tijdzone-valkuilen die specifiek zijn voor Postgres.

Samenvatting

Deze uitgebreide gids behandelt de essentie van Unix timestamps — van epoch-oorsprong en conversies op meerdere precisieniveaus tot implementaties in verschillende talen, tijdzone-afhandeling, DST-valkuilen en aanbevolen aanpak voor engineering in logging, databases en API-ontwerp. De belangrijkste les: sla op in UTC, geef weer in lokale tijd, en wees altijd expliciet over de eenheden van je timestamps.

Timestamps zijn slechts één onderdeel van de gereedschapskist van de ontwikkelaar. Verken meer essentiële tools voor encoderen, hashing en omrekenen via de Go Tools-catalogus.

Gerelateerde artikelen

Alle artikelen bekijken