🕐
← Terug naar handleidingen

Werken met Unix-tijdstempels in programmeertalen

· Tags: javascript, python, php, golang, programming, unix-timestamp, epoch, database

Waarom Unix-tijdstempels in programmeren?

Unix-tijdstempels zijn het universele ruilmiddel van tijd in software. Ze maken datumrekenkunde triviaal (tel gewoon seconden op of trek ze af), elimineren tijdzoneverwarring en serialiseren netjes naar JSON. Elke programmeertaal biedt eenvoudige functies om ermee te werken, maar de API's verschillen subtiel. Deze gids behandelt de meest voorkomende talen en hun beste praktijken.

JavaScript (Browser en Node.js)

JavaScript gebruikt milliseconden voor zijn Date-object, terwijl de meeste andere systemen seconden gebruiken. Dit is de meest voorkomende bron van bugs.

Het huidige tijdstempel verkrijgen

// Milliseconds since epoch (standard JavaScript)
const nowMs = Date.now();         // 1785292800000

// Seconds since epoch (for compatibility)
const nowSec = Math.floor(Date.now() / 1000);  // 1785292800

// Node.js high-resolution timer (microseconds)
const hrTime = process.hrtime.bigint();

Een tijdstempel converteren naar een datum

// From seconds (most APIs and databases)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000);  // Multiply by 1000!

// From milliseconds (JavaScript native)
const dateFromMs = new Date(1785292800000);

// Format the result
console.log(date.toISOString());
// Output: 2026-07-19T00:00:00.000Z

console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// Output: 7/18/2026, 8:00:00 PM

Een datumstring parseren naar een tijdstempel

// Using Date.parse() (returns milliseconds)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000;  // 1785292800

// Using Date constructor
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);

Waarschuwing: het gedrag van Date.parse() varieert tussen browsers voor niet-standaard datumstrings. Het gebruik van ISO 8601-formaat met een tijdzoneaanduiding (Z voor UTC) is het veiligst.

Werken met tijdzones in JavaScript

// Format in a specific timezone
const date = new Date(1785292800 * 1000);
const options = {
  timeZone: "Asia/Tokyo",
  year: "numeric", month: "2-digit", day: "2-digit",
  hour: "2-digit", minute: "2-digit", second: "2-digit",
};
console.log(date.toLocaleString("ja-JP", options));
// Output: 07/19/2026 09:00:00

Voor geavanceerde tijdzonebewerkingen worden de Intl.DateTimeFormat-API of bibliotheken zoals date-fns-tz en Luxon aanbevolen.

Python

Python biedt zowel low-level- (time) als high-level-modules (datetime) voor het werken met tijdstempels.

Het huidige tijdstempel verkrijgen

import time

# Seconds as a float (including fractional milliseconds)
current = time.time()
# Example: 1785292800.123456

# As an integer
current_int = int(time.time())

Een tijdstempel converteren naar een datetime

from datetime import datetime

# UTC datetime (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)

# Timezone-aware datetime (Python 3.9+ with zoneinfo)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))

# Formatted string
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# Output: 2026-07-19 00:00:00

Een datumstring parseren naar een tijdstempel

import time
from datetime import datetime

# From date string
dt = datetime.strptime("2026-07-19 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(dt.timetuple())  # Treats as local time

# For UTC input
from datetime import timezone
timestamp_utc = dt.replace(tzinfo=timezone.utc).timestamp()

Werken met Pandas (gegevensanalyse)

import pandas as pd

# Convert a column of Unix timestamps to datetime
df["timestamp"] = pd.to_datetime(df["unix_seconds"], unit="s")

# Convert to different units
df["datetime_ms"] = pd.to_datetime(df["unix_milliseconds"], unit="ms")

# Set a timezone
df["timestamp_ny"] = df["timestamp"].dt.tz_localize("UTC").dt.tz_convert("America/New_York")

PHP

PHP heeft de eenvoudigste API voor tijdstempelbewerkingen.

Het huidige tijdstempel verkrijgen

<?php
$now = time();           // Integer: 1785292800
$nowMicro = microtime();  // String: "0.12345600 1785292800"
$nowFloat = microtime(true);  // Float: 1785292800.1235

Een tijdstempel converteren naar een datum

<?php
echo date("Y-m-d H:i:s", 1785292800);
// Output: 2026-07-19 00:00:00

// With timezone
$tz = new DateTimeZone("Europe/London");
$dt = new DateTime("@1785292800");
$dt->setTimezone($tz);
echo $dt->format("Y-m-d H:i:s");

Go

De time-package van Go is goed ontworpen, maar vereist een expliciet begrip van de betrokken typen.

Het huidige tijdstempel verkrijgen

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    sec := now.Unix()            // int64 seconds
    milli := now.UnixMilli()     // int64 milliseconds
    nano := now.UnixNano()       // int64 nanoseconds
    fmt.Printf("Seconds: %d\n", sec)
}

Een tijdstempel converteren naar een datum

t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// Output: 2026-07-19 00:00:00 +0000 UTC

// Format as string
fmt.Println(t.Format("2006-01-02 15:04:05"))
// Output: 2026-07-19 00:00:00

// With timezone
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))

Rust

use std::time::{SystemTime, UNIX_EPOCH};

// Current timestamp
let now = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .expect("Time went backwards");
println!("Seconds: {}", now.as_secs());

// Timestamp to date
let dt = chrono::NaiveDateTime::from_timestamp_opt(1785292800, 0).unwrap();
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));

Databaseopslag: beste praktijken

Het juiste kolomtype kiezen

| Database | Aanbevolen type | Opmerkingen | |----------|-----------------|-------| | PostgreSQL | TIMESTAMP WITH TIME ZONE of BIGINT | Native tijdstempeltype heeft de voorkeur | | MySQL / MariaDB | INT UNSIGNED (voor datums tot 2106) of BIGINT | Vermijd het type TIMESTAMP (bereik eindigt in 2038) | | SQLite | INTEGER | SQLite heeft geen native tijdstempeltype | | MongoDB | Date-object of int64 | BSON Date is intern een 64-bits tijdstempel |

PostgreSQL-voorbeeld

-- Store as native timestamp
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
    payload JSONB
);

-- Insert with current time
INSERT INTO events (occurred_at) VALUES (NOW());

-- Query as Unix timestamp
SELECT EXTRACT(EPOCH FROM occurred_at) AS unix_ts FROM events;

MySQL-voorbeeld

-- Using BIGINT for future-proof storage
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time BIGINT NOT NULL,
    message TEXT
);

-- Insert current timestamp
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');

-- Query and convert
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;

Taalvergelijkingstabel

| Taal | Huidig tijdstempel | Tijdstempel naar datum | Datum naar tijdstempel | Resolutie | |----------|-------------------|-------------------|-------------------|------------| | JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | Milliseconden | | Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | Float seconden | | PHP | time() | date("Y-m-d", ts) | strtotime(str) | Seconden | | Go | time.Now().Unix() | time.Unix(ts, 0) | time.Parse(layout, str).Unix() | Seconden | | Rust | SystemTime::now() | NaiveDateTime::from_timestamp_opt() | — | Verschillend |

Welke taal je ook gebruikt, onze Unix-tijdstempelconverter is een betrouwbare metgezel voor snelle controles en debugging.