Penjelasan Timestamps Epoch: Cara Kerja Waktu Unix (dan Mengapa Rusak)

17 Jun 2026 1,048 words

Penjelasan Timestamps Epoch: Cara Kerja Waktu Unix (dan Mengapa Rusak)

Timestamp epoch — juga disebut waktu Unix atau waktu POSIX — adalah jumlah detik yang telah berlalu sejak 1 Januari 1970 00:00:00 UTC, tidak termasuk detik kabisat. Ini adalah bilangan bulat sederhana yang mewakili momen waktu yang tepat, tidak tergantung pada zona waktu dan sistem kalender. Kesederhanaan ini menjadikannya cara standar komputer bertukar informasi waktu, tetapi juga memiliki keterbatasan dan kendala terkenal yang harus dipahami setiap pengembang.

Cara Kerja Waktu Unix

Waktu Unix menghitung maju dari epoch. Satu hari sama dengan 86.400 detik (24 × 60 × 60). Timestamp bertambah tepat satu per detik terlepas dari zona waktu, daylight saving, atau tahun kabisat.

Timestamp 0        → 1970-01-01 00:00:00 UTC
Timestamp 86400    → 1970-01-02 00:00:00 UTC
Timestamp 1000000  → 1970-01-12 13:46:40 UTC
Timestamp 1782000000 → 2026-06-17 00:00:00 UTC
// JavaScript — ambil timestamp Unix saat ini
const nowInSeconds = Math.floor(Date.now() / 1000);
console.log(nowInSeconds);

// Konversi timestamp ke tanggal
const date = new Date(nowInSeconds * 1000);
console.log(date.toISOString());
// PHP — ambil timestamp Unix saat ini
echo time();             // detik sejak epoch
echo microtime(true);    // detik dengan presisi mikrodetik

// Konversi timestamp ke tanggal
echo date('Y-m-d H:i:s', 1782000000);

Detik vs Milidetik: Sumber Bug yang Umum

Salah satu bug terkait timestamp yang paling sering terjadi adalah kebingungan antara detik dan milidetik. Date.now() di JavaScript mengembalikan milidetik, sedangkan time() di PHP mengembalikan detik. Banyak database menyimpan timestamp dalam detik, dan banyak API menggunakan milidetik.

Sistem Satuan Contoh Nilai Tanggal
Unix / POSIX Detik 1782000000 2026-06-17
JavaScript Date.now() Milidetik 1782000000000 2026-06-17
Java System.currentTimeMillis() Milidetik 1782000000000 2026-06-17
PHP time() Detik 1782000000 2026-06-17
Python time.time() Detik (float) 1782000000.123 2026-06-17
// ❌ Salah — memperlakukan milidetik sebagai detik
const timestamp = 1782000000; // ini dalam detik
const wrongDate = new Date(timestamp); // diartikan sebagai milidetik
console.log(wrongDate.toISOString()); // 1970-01-21 — sepenuhnya salah

// ✅ Benar — kalikan dengan 1000
const correctDate = new Date(timestamp * 1000);
console.log(correctDate.toISOString()); // 2026-06-17
import time
from datetime import datetime

# ❌ Salah — lupa membagi milidetik
millis = 1782000000000
wrong = datetime.fromtimestamp(millis)  # ValueError: year out of range

# ✅ Benar
correct = datetime.fromtimestamp(millis / 1000)
print(correct)  # 2026-06-17 00:00:00

Masalah Tahun 2038

Waktu Unix menggunakan integer 32-bit bertanda, yang memiliki nilai maksimum 2.147.483.647. Pada 19 Januari 2038 pukul 03:14:07 UTC, timestamp akan mencapai batas ini. Satu detik kemudian, integer 32-bit bertanda berputar ke −2.147.483.648, yang bertepatan dengan 13 Desember 1901.

2,147,483,647 → 2038-01-19 03:14:07 UTC (maks 32-bit signed)
2,147,483,648 → berputar ke negatif (underflow)

Sistem yang masih rentan terhadap Y2038:

  • Sistem tertanam (router, perangkat IoT, firmware mobil)
  • Database lawas yang menyimpan timestamp sebagai INT(10)
  • Kernel Linux lama pada arsitektur 32-bit
  • Sistem file menggunakan timestamp 32-bit
  • Versi PHP lama pada build 32-bit

Cara memeriksa apakah sistem aman-Y2038:

# Linux — periksa apakah time_t 64-bit
getconf LONG_BIT
# 64 → aman
# 32 → periksa versi kernel dan libc

# PHP — verifikasi ukuran integer
php -r 'echo PHP_INT_SIZE;'
# 8 → aman (64-bit)
# 4 → rentan (32-bit)

Sistem modern dengan time_t 64-bit dapat mewakili timestamp hingga sekitar 292 miliar tahun ke depan, menjadikan Y2038 bukan masalah. Sebagian besar server produksi sudah menjalankan sistem operasi 64-bit, tetapi sistem tertanam dan lawas masih berisiko.

Detik Kabisat: Kompleksitas Tersembunyi

Waktu Unix mengabaikan detik kabisat. Menurut definisi, setiap hari memiliki tepat 86.400 detik. Namun waktu astronomi (UT1) kadang-kadang memerlukan satu detik tambahan — detik kabisat — untuk tetap selaras dengan rotasi Bumi. Ketika detik kabisat terjadi, waktu Unix mengulangi detik yang sama:

2016-12-31 23:59:59 UTC
2016-12-31 23:59:60 UTC  ← detik kabisat (tidak dapat direpresentasikan dalam waktu Unix)
2017-01-01 00:00:00 UTC

Sebagian besar aplikasi mengabaikan detik kabisat sepenuhnya karena terjadi secara tidak terduga (biasanya sekali setiap 1-3 tahun) dan penanganannya menambah kompleksitas yang signifikan. Sistem yang memerlukan ketepatan waktu — seperti platform perdagangan keuangan dan observatorium astronomi — menggunakan TAI (Waktu Atom Internasional) atau waktu GPS sebagai pengganti waktu Unix.

Kendala Umum

Kendala 1: Menggunakan Satuan yang Salah

// API mengembalikan timestamp dalam detik
const apiTimestamp = 1782000000;

// ❌ Salah — new Date() mengharapkan milidetik
const date = new Date(apiTimestamp);

// ✅ Benar
const date = new Date(apiTimestamp * 1000);

Kendala 2: Menyimpan sebagai INT(10) di MySQL

-- ❌ Salah — INT(10) meluap pada 2,1 miliar (2038)
CREATE TABLE events (
    created_at INT(10) NOT NULL
);

-- ✅ Benar — gunakan BIGINT atau TIMESTAMP
CREATE TABLE events (
    created_at BIGINT NOT NULL,       -- 64-bit, aman
    created_at2 TIMESTAMP NOT NULL     -- MySQL menangani konversi
);

Kendala 3: Menganggap Waktu Lokal sebagai Default

// ❌ Salah — date() menggunakan zona waktu default server
echo date('Y-m-d H:i:s', $timestamp);

// ✅ Benar — secara eksplisit tentukan UTC
echo gmdate('Y-m-d H:i:s', $timestamp);
echo date('Y-m-d H:i:s', $timestamp); // jika TZ default diatur ke UTC

Kendala 4: Integer Overflow di JavaScript

Angka JavaScript adalah floating point 64-bit tetapi operasi bitwise memperlakukannya sebagai integer 32-bit bertanda. Ini dapat menyebabkan bug mirip Y2038 yang tidak terduga bahkan di browser modern.

// Operasi bitwise JavaScript memperlakukan sebagai 32-bit
const timestamp = 2500000000; // melebihi maks 32-bit signed
const shifted = timestamp << 1; // ❌ overflow!
console.log(shifted); // -1794967296 (berputar)

Alat Konversi Epoch

Alat Epoch / Unix Timestamp Converter di Help2Code menyediakan tampilan timestamp saat ini secara langsung dalam detik dan milidetik, konversi dua arah antara nilai epoch dan tanggal yang dapat dibaca, serta dukungan untuk zona waktu lokal dan UTC. Gunakan untuk men-debug masalah timestamp, menghasilkan timestamp untuk pengujian, atau memverifikasi respons API. Alat Timezone Converter juga berguna untuk memeriksa bagaimana timestamp epoch dipetakan ke zona waktu yang berbeda.

Kesimpulan

Timestamp epoch adalah cara sederhana dan universal untuk mewakili momen waktu, tetapi memiliki beberapa peringatan penting: selalu periksa apakah Anda bekerja dengan detik atau milidetik, gunakan penyimpanan 64-bit untuk menghindari masalah Y2038, dan jangan pernah menganggap zona waktu default sesuai dengan yang Anda maksud. Gunakan alat Epoch Converter untuk konversi cepat dan ingat pedoman di atas saat menangani timestamp dalam kode produksi.


About this article

Pelajari cara kerja timestamp epoch Unix, mengapa tahun 2038 menjadi masalah, perbedaan detik dan milidetik, serta cara menghindari kesalahan umum.


Related Articles


Related Tools

Help2Code Logo
Menu