Unix Timestamp Dijelaskan: Konversi dan Jebakan Umum
Unix timestamp adalah salah satu konsep yang paling sederhana namun paling sering disalahpahami dalam pemrograman. Ini adalah jumlah detik yang telah berlalu sejak 1 Januari 1970, 00:00:00 UTC — momen yang dikenal sebagai Unix epoch. Meskipun sederhana, timestamp adalah sumber bug yang terkait dengan zona waktu, presisi, dan overflow.
Apa Itu Unix Epoch?
Unix epoch — 1 Januari 1970, 00:00:00 UTC — dipilih sebagai titik awal untuk waktu Unix. Setiap timestamp diukur relatif terhadap momen ini:
| Timestamp | Tanggal dan Waktu (UTC) |
|---|---|
| 0 | 1 Jan 1970 00:00:00 |
| 86400 | 2 Jan 1970 00:00:00 |
| 1000000000 | 9 Sep 2001 01:46:40 |
| 1700000000 | 14 Nov 2023 22:13:20 |
| 2000000000 | 18 Mei 2033 03:33:20 |
Timestamp negatif mewakili tanggal sebelum epoch. Misalnya, -86400 adalah 31 Desember 1969.
Konversi timestamp secara instan dengan Timestamp Converter kami.
Detik vs. Milidetik
Ini adalah sumber kebingungan paling umum. Sistem yang berbeda menggunakan presisi yang berbeda:
| Sistem | Presisi | Contoh |
|---|---|---|
| Unix/POSIX | Detik | 1700000000 |
| JavaScript | Milidetik | 1700000000000 |
| Java (System.currentTimeMillis) | Milidetik | 1700000000000 |
| Python (time.time) | Detik (float) | 1700000000.123 |
| PostgreSQL (extract epoch) | Detik (float) | 1700000000.123456 |
Aturan praktis: Jika angkanya memiliki 13 digit, itu adalah milidetik. Jika memiliki 10 digit, itu adalah detik.
// JavaScript returns milliseconds
const nowMs = Date.now(); // 1700000000000
const nowSec = Math.floor(nowMs / 1000); // 1700000000
Penanganan Zona Waktu
Unix timestamp selalu UTC. Timestamp tidak mengandung informasi zona waktu. Ini sebenarnya adalah fitur — memberikan titik referensi universal.
Kebingungan muncul saat mengonversi timestamp ke tanggal yang mudah dibaca manusia:
const ts = 1700000000;
const date = new Date(ts * 1000);
date.toUTCString(); // "Tue, 14 Nov 2023 22:13:20 GMT"
date.toLocaleString(); // Depends on user's local time zone
date.toISOString(); // "2023-11-14T22:13:20.000Z"
Praktik terbaik: Simpan dan kirim timestamp dalam UTC. Konversi ke waktu lokal hanya di lapisan tampilan, sedekat mungkin dengan pengguna.
Masalah Tahun 2038
Sistem Unix tradisional menyimpan timestamp sebagai integer bertanda 32-bit. Nilai maksimumnya adalah 2.147.483.647, yang sesuai dengan 19 Januari 2038, 03:14:07 UTC.
Setelah momen ini, timestamp 32-bit overflow ke nilai negatif, kembali ke 13 Desember 1901. Ini analogis dengan bug Y2K.
Status saat ini:
- Sebagian besar sistem modern menggunakan timestamp 64-bit (baik hingga tahun 292 miliar)
- Kernel Linux telah bersih timestamp 64-bit sejak versi 5.6 (2020)
- Sistem embedded dan database lama tetap berisiko
- Jika Anda membangun perangkat lunak yang menangani tanggal setelah 2038, verifikasi penyimpanan timestamp Anda
Konversi di Berbagai Bahasa Pemrograman
JavaScript
// Current timestamp (seconds)
const now = Math.floor(Date.now() / 1000);
// Timestamp to Date
const date = new Date(1700000000 * 1000);
// Date to timestamp
const ts = Math.floor(new Date('2023-11-14').getTime() / 1000);
Python
import time, datetime
# Current timestamp
now = int(time.time())
# Timestamp to datetime
dt = datetime.datetime.fromtimestamp(1700000000, tz=datetime.timezone.utc)
# Datetime to timestamp
ts = int(dt.timestamp())
SQL (PostgreSQL)
-- Current timestamp
SELECT EXTRACT(EPOCH FROM NOW());
-- Timestamp to date
SELECT TO_TIMESTAMP(1700000000);
-- Date to timestamp
SELECT EXTRACT(EPOCH FROM '2023-11-14'::timestamp);
Jebakan Umum
1. Mencampur Detik dan Milidetik
Jika tanggal menunjukkan Januari 1970, Anda mungkin memasukkan detik di mana milidetik yang diharapkan (atau sebaliknya). Selalu periksa presisi mana yang diharapkan oleh API.
2. Mengabaikan Zona Waktu dalam String Tanggal
Memparsing "2023-11-14" tanpa zona waktu membuat tanggal di zona waktu lokal, yang bervariasi menurut lokasi server. Selalu sertakan zona waktu: "2023-11-14T00:00:00Z".
3. Presisi Floating Point
Saat menyimpan timestamp sebagai angka floating-point, Anda mungkin kehilangan presisi melebihi milidetik. Untuk presisi mikrodetik atau nanodetik, gunakan integer dengan pengali yang sesuai.
4. Detik Kabisat
Unix timestamp tidak memperhitungkan detik kabisat. Satu hari Unix selalu tepat 86.400 detik, meskipun hari UTC aktual kadang memiliki 86.401 detik. Untuk sebagian besar aplikasi, ini tidak relevan. Untuk aplikasi ilmiah atau satelit, gunakan TAI (International Atomic Time) sebagai gantinya.
ISO 8601: Alternatif yang Mudah Dibaca Manusia
Meskipun timestamp bagus untuk komputasi, ISO 8601 adalah standar untuk representasi tanggal yang mudah dibaca manusia:
2023-11-14T22:13:20Z # UTC
2023-11-14T17:13:20-05:00 # Eastern Time
2023-11-14 # Date only
Sebagian besar API sebaiknya menerima dan mengembalikan string ISO 8601. Gunakan timestamp secara internal untuk perhitungan dan penyimpanan.
FAQ
Mengapa waktu Unix dimulai pada 1 Januari 1970?
Tanggal tersebut dipilih secara arbitrer saat Unix sedang dikembangkan di Bell Labs pada awal 1970-an. Diperlukan tanggal yang cukup baru untuk menghindari pemborosan bit pada tanggal masa lalu yang jauh. Karena integer 32-bit dapat menyimpan sekitar 68 tahun di setiap arah, memulai dari 1970 mencakup tanggal dari 1901 hingga 2038.
Haruskah saya menyimpan tanggal sebagai timestamp atau string terformat di database saya?
Simpan tanggal sebagai timestamp (integer atau tipe datetime native) untuk pengurutan, perbandingan, dan aritmetika yang efisien. String terformat lebih sulit untuk di-query dan diurutkan dengan benar. Sebagian besar database memiliki tipe datetime native yang menangani ini dengan baik. Cadangkan pemformatan string untuk tampilan dan respons API.
Sumber Terkait
- Timestamp Converter — Konversi antara Unix timestamp dan tanggal yang mudah dibaca
- JSON Formatting Best Practices — Menangani tanggal dalam respons JSON
- UUID Guide — Format pengenal umum lainnya dengan varian berbasis waktu