Skip to content
Kembali ke Blog
Tutorial

Panduan Unix Timestamp: Presisi, Timezone & Tips DST

Unix timestamp dijelaskan: asal-usul epoch, konversi detik/ms/μs, penanganan timezone, jebakan DST, dan contoh kode dalam JS, Python dan Go.

14 menit baca

Panduan Lengkap Unix Timestamp: Konversi Detik/Milidetik/Mikrodetik & Praktik Terbaik Timezone

Unix timestamp merepresentasikan waktu sebagai jumlah waktu yang berlalu sejak Unix epoch (1 Januari 1970, 00:00:00 UTC). Hampir semua web server dan database menggunakan representasi ini secara internal. Artikel ini membahas perbedaan presisi, implementasi di beberapa bahasa pemrograman, penanganan timezone, dan jebakan daylight saving time.

Asal-Usul dan Definisi Unix Timestamp

Unix Epoch dimulai pada 1 Januari 1970, 00:00:00 UTC. Unix timestamp 0 sesuai dengan momen ini, sementara 1262304000 merepresentasikan 2010-01-01 00:00:00 UTC. Sistem ini mengabaikan efek leap second secara default.

Awalnya disimpan sebagai integer bertanda 32-bit, ini menciptakan Masalah Tahun 2038 — nilai maksimum akan overflow pada 19 Januari 2038, 03:14:07 UTC. Sistem modern menggunakan integer 64-bit, memperluas rentang waktu yang dapat direpresentasikan secara drastis.

Perbedaan Presisi Waktu

UnitJumlah per DetikDigitAplikasi Umum
Detik (s)110Sistem Unix/Linux tradisional
Milidetik (ms)1.00013JavaScript, Java, logging
Mikrodetik (μs)1.000.00016Distributed tracing, database
Nanodetik (ns)1.000.000.00019Bahasa Go, analisis performa

Aturan praktis: Timestamp 10 digit umumnya merepresentasikan detik, 13 digit merepresentasikan milidetik, 16 digit merepresentasikan mikrodetik, dan 19 digit merepresentasikan nanodetik.

Timestamp JavaScript

JavaScript menggunakan milidetik secara native. Constructor Date() mengasumsikan angka input adalah milidetik — untuk timestamp level detik, kalikan dengan 1000.

// Dapatkan Unix timestamp saat ini (dalam milidetik)
const timestampMs = Date.now();
console.log(timestampMs);  // Contoh output: 1692268800123

// Untuk timestamp level detik, bagi milidetik dengan 1000 dan bulatkan ke bawah
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // Contoh output: 1692268800

// Konversi Unix timestamp kembali ke objek Date
let ts = 1692268800;
let date = new Date(ts * 1000);
console.log(date.toISOString()); // "2023-08-17T16:00:00.000Z"

Timestamp Python

time.time() Python mengembalikan Unix timestamp level detik sebagai nilai floating-point:

import time
from datetime import datetime, timezone

# Dapatkan Unix timestamp saat ini (detik, float)
now_sec = time.time()
print(now_sec)  # Contoh output: 1692268800.123456

# Dapatkan milidetik (integer)
now_millis = int(time.time() * 1000)
print(now_millis)  # Contoh: 1692268800123

# Dapatkan nanodetik (Python 3.7+)
now_nanos = time.time_ns()
print(now_nanos)  # Contoh: 1692268800123456789

# Konversi ke 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"))  # Waktu lokal
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))    # Waktu UTC

Timestamp Bahasa Go

Library time Go menyediakan berbagai level presisi:

package main

import (
    "fmt"
    "time"
)

func main() {
    // Dapatkan Unix timestamp saat ini
    sec := time.Now().Unix()        // Detik
    msec := time.Now().UnixMilli()  // Milidetik (Go 1.17+)
    nsec := time.Now().UnixNano()   // Nanodetik

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

    // Konversi timestamp ke objek Time
    t := time.Unix(sec, 0)
    fmt.Println(t.UTC())
    fmt.Println(t)
}

Kesalahan Umum dan Praktik Terbaik

Contoh Kesalahan: Unit yang Tidak Jelas

// ✗ Salah: unit timestamp tidak jelas
const timestamp = 1692268800;
const date = new Date(timestamp); // Error: diperlakukan sebagai milidetik, menampilkan 1970

// ✓ Benar: nyatakan unit dengan jelas
const timestampSec = 1692268800;
const timestampMs = 1692268800000;
const dateFromSec = new Date(timestampSec * 1000);

Praktik Terbaik Penamaan Field

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

Jebakan Penanganan Timezone

Ada empat jebakan utama saat bekerja dengan timezone:

  1. Mencampurkan waktu lokal dan UTC — Unix timestamp selalu berbasis UTC; konversi ke lokal hanya saat menampilkan
  2. Tidak menyimpan informasi timezone — Menciptakan ambiguitas; selalu simpan UTC atau sertakan offset
  3. Inkonsistensi timezone lintas sistem — Semua sistem harus menggunakan referensi timezone yang sama (direkomendasikan UTC)
  4. Menghitung offset DST secara manual — Andalkan library bawaan, jangan hardcode

Pendekatan yang direkomendasikan: “Penyimpanan terstandarisasi, tampilan terlokalkan.” Gunakan UTC atau Unix timestamp dalam fase penyimpanan dan transmisi untuk memastikan konsistensi; format sesuai timezone pengguna saat menampilkan.

Masalah Daylight Saving Time (DST)

DST menciptakan dua periode bermasalah:

  • Waktu yang dilompati: Ketika DST dimulai, jam melompat maju. Misalnya, 02:00 langsung melompat ke 03:00, membuat 02:30 tidak ada.
  • Waktu yang berulang: Ketika DST berakhir, 01:00–01:59 muncul dua kali, menciptakan ambiguitas.

Unix timestamp sendiri tetap kontinu dan tidak terpengaruh oleh DST, tapi konversi waktu lokal memerlukan penanganan yang hati-hati.

Praktik Terbaik untuk Logging, Database, dan API

Sistem Logging

Seragamkan timezone UTC + format ISO 8601; sertakan timestamp milidetik atau presisi mikrodetik jika diperlukan.

Database

Utamakan tipe kalender native dengan timezone; gunakan BIGINT untuk timestamp numerik dengan indikasi unit yang jelas dalam nama field (misalnya, *_epoch_ms).

API

Tentukan format dan unit dengan jelas. Antarmuka eksternal harus menggunakan ISO 8601 (mudah dibaca, menyertakan timezone); sistem internal dapat menggunakan timestamp numerik dengan unit yang didokumentasikan.

Skenario Kesalahan Umum

  • Kegagalan parsing 13 digit: Timestamp milidetik yang diberikan ke fungsi yang mengharapkan detik menyebabkan overflow. Tentukan unit dari jumlah digit terlebih dahulu.
  • Ketidakcocokan format: Tanggal tidak valid, timezone yang hilang, atau titik pergantian DST menyebabkan error parsing.
  • Offset timezone: Penyimpangan jam utuh (±8 jam) biasanya menunjukkan masalah unifikasi. Rekomendasikan penggunaan UTC secara internal.
  • Overflow numerik: Sistem 32-bit menghadapi batas 2038; prioritaskan integer 64-bit.

Pertanyaan yang Sering Diajukan

Mengapa 1 Januari 1970?

Pengembangan sistem operasi Unix dimulai pada tahun 1970, dan itu adalah tahun dekade yang bulat — mudah diingat dan dihitung. Integer 32-bit dapat merepresentasikan tanggal dari 1970 hingga 2038, yang cukup pada saat itu.

Bagaimana membedakan detik vs milidetik?

Tiga metode: periksa jumlah digit (10 digit = detik, 13 = milidetik, 16 = mikrodetik, 19 = nanodetik), verifikasi dengan menghitung dan mengecek kewajaran, atau gunakan tool konversi online.

Apakah masalah 2038 masih relevan?

Sistem modern yang menggunakan integer 64-bit telah sebagian besar menyelesaikan ini. Bahasa pemrograman utama sudah mendukung timestamp 64-bit. Sistem legacy 32-bit dan perangkat embedded mungkin masih perlu diperhatikan.

Mengapa DST menyebabkan masalah?

Diskontinuitas waktu dari jam yang dilompati dan pengulangan waktu dari jam yang berulang menciptakan ambiguitas parsing. Sistem yang berbeda menangani waktu ambigu dengan strategi yang berbeda. Solusinya: gunakan UTC secara internal, konversi ke waktu lokal hanya saat menampilkan.

Mengapa timestamp JavaScript dan Python berbeda?

Date.now() JavaScript mengembalikan milidetik (13 digit); time.time() Python mengembalikan detik (floating-point dengan presisi mikrodetik). Konversi memerlukan pembagian/perkalian dengan 1000.

Coba Sendiri

Konversi Unix timestamp secara instan dengan Unix Timestamp Converter kami — mendeteksi otomatis detik, milidetik, dan mikrodetik. 100% di browser Anda.

Bekerja dengan PostgreSQL? Baca Apa Sebenarnya yang Tersimpan di Kolom timestamp PostgreSQL? untuk jebakan timezone khusus Postgres.

Ringkasan

Dua aturan yang menyelesaikan sebagian besar masalah timestamp: simpan dalam UTC, tampilkan dalam waktu lokal. Dan selalu eksplisit tentang unit — beri nama field timestamp_ms atau created_at_epoch_s, bukan hanya timestamp.

Timestamp hanyalah satu bagian dari toolkit developer. Jelajahi lebih banyak tool penting untuk developer untuk encoding, hashing, dan konversi data.

Artikel Terkait

Lihat semua artikel