Unix Timestamp UTC: Timezone, Offset & Konversi Waktu

Peta dunia dengan garis zona waktu UTC dan stempel waktu Unix yang terhubung ke beberapa jam lokal

Kalau kamu pernah menyimpan tanggal di database, membangun API, atau men-debug bug penjadwalan yang hanya muncul di negara tertentu, kamu pasti pernah berhadapan dengan hubungan antara Unix timestamp UTC dan waktu lokal. Kebingungan ini nyata adanya dan bisa menyebabkan bug di production. Artikel ini menjelaskan secara detail apa itu UTC, kenapa Unix timestamp selalu berbasis UTC, cara kerja offset timezone, dan cara mengonversi timestamp dengan benar di JavaScript, Python, dan PHP. Kamu juga akan menemukan kesalahan paling umum yang sering dilakukan developer beserta cara menghindarinya.

Poin Utama:

  • Unix timestamp selalu menghitung detik sejak 1 Januari 1970, 00:00:00 UTC - tidak ada informasi timezone yang melekat padanya.
  • UTC adalah titik referensi universal; waktu lokal hanyalah UTC ditambah atau dikurangi sebuah offset.
  • Mengonversi timestamp ke waktu lokal dengan benar memerlukan pengetahuan tentang timezone target, bukan sekadar angka offset.
  • DST (Daylight Saving Time) mengubah offset suatu timezone, itulah mengapa hardcoding offset bisa menyebabkan bug.

Apa Itu UTC dan Mengapa Penting?

UTC adalah singkatan dari Coordinated Universal Time. Ini adalah standar waktu utama yang digunakan dunia untuk mengatur jam dan waktu. Berbeda dengan timezone, UTC tidak memiliki offset - ia adalah titik nol. UTC tidak mengikuti Daylight Saving Time dan tidak berubah untuk negara atau wilayah mana pun.

Sebelum UTC, ada GMT (Greenwich Mean Time), dan banyak orang masih menggunakan kedua istilah ini secara bergantian. Secara teknis, UTC dan GMT sedikit berbeda, namun untuk sebagian besar keperluan software keduanya dianggap setara. UTC secara resmi didefinisikan oleh rekomendasi ITU-R TF.460 dan dikelola menggunakan jam atom.

Bagi developer, UTC penting karena memberikan satu titik referensi yang jelas dan tidak ambigu. Jika server kamu di Frankfurt dan pengguna kamu di Jakarta sama-sama mencatat sebuah event menggunakan UTC, kamu selalu bisa membandingkan dua timestamp tersebut dengan benar. Kalau masing-masing mencatatnya dalam waktu lokal tanpa metadata, masalah pun dimulai.

Mengapa Unix Timestamp Selalu UTC

Unix timestamp (juga disebut epoch time atau POSIX time) didefinisikan sebagai jumlah detik yang telah berlalu sejak 1 Januari 1970, 00:00:00 UTC. Titik acuan itu - tengah malam tanggal 1 Januari 1970 dalam UTC - sudah tertanam langsung dalam definisinya. Tidak ada versi Unix time yang dimulai dari waktu lokal New York atau waktu lokal Tokyo.

Ini berarti jawaban atas pertanyaan "apakah Unix timestamp selalu UTC?" adalah ya, berdasarkan definisinya. Angka 1700000000 merepresentasikan momen yang persis sama bagi setiap orang di seluruh dunia. Yang berbeda antar pengguna adalah bagaimana momen tersebut ditampilkan dalam timezone lokal mereka.

Untuk memahami dasar konsep ini lebih mendalam, baca artikel kami tentang Epoch Time: Dasar dari Unix Timestamp.

Desain berbasis UTC ini adalah salah satu properti Unix time yang paling berguna. Karena angkanya sendiri tidak membawa informasi timezone, dua sistem di negara yang berbeda bisa saling bertukar timestamp dan keduanya tahu persis momen mana yang dimaksud, tanpa negosiasi tambahan apa pun.

UTC vs Waktu Lokal dan Timezone

UTC adalah referensinya. Waktu lokal adalah apa yang kamu dapatkan ketika kamu menerapkan aturan timezone di atasnya. Timezone bukan sekadar offset tetap - ia adalah wilayah bernama dengan sekumpulan aturan yang bisa berubah seiring waktu (terutama karena Daylight Saving Time).

Misalnya, "Eastern Time" di Amerika Serikat adalah UTC-5 di musim dingin dan UTC-4 di musim panas. Nama timezone-nya adalah "America/New_York" dalam database timezone IANA, yang merupakan sumber otoritatif aturan timezone yang digunakan oleh sebagian besar bahasa pemrograman dan sistem operasi.

Kesimpulan praktisnya: ketika kamu menyimpan Unix timestamp di database, kamu menyimpan nilai UTC. Ketika kamu menampilkannya ke pengguna, kamu mengonversinya ke timezone lokal mereka. Jangan pernah menyimpan waktu lokal sebagai angka mentah dan mengasumsikannya sebagai UTC. Di situlah bug mulai bermunculan.

Cara Kerja UTC Offset

UTC offset menggambarkan seberapa jauh suatu timezone dari UTC. Ditulis sebagai +HH:MM atau -HH:MM. Beberapa contohnya:

  • UTC+02:00 - Central European Summer Time (CEST), digunakan di Jerman dan Prancis selama musim panas.
  • UTC-05:00 - Eastern Standard Time (EST), digunakan di Pantai Timur AS di musim dingin.
  • UTC+05:30 - India Standard Time (IST), yang merupakan offset setengah jam.
  • UTC+07:00 - Waktu Indonesia Barat (WIB), digunakan di Jakarta dan sebagian besar wilayah Indonesia bagian barat.
  • UTC+00:00 - UTC itu sendiri, juga digunakan oleh Inggris di musim dingin (GMT).

Untuk mengonversi epoch time UTC ke waktu lokal secara manual, kamu menambahkan atau mengurangi offset dalam satuan detik. Untuk UTC+07:00, itu adalah 7 * 3600 = 25200 detik. Jadi kalau Unix timestamp kamu adalah 1700000000, waktu lokal di UTC+07:00 akan sesuai dengan 1700000000 + 25200 sebelum diformat.

Namun, melakukan ini secara manual berisiko karena offset berubah mengikuti DST. Selalu gunakan library timezone yang tepat daripada melakukan hardcoding offset. Lihat panduan kami tentang Cara Mengonversi Unix Timestamp ke Tanggal untuk pembahasan lebih mendalam tentang metode konversi.

Mengonversi Unix Timestamp ke Waktu Lokal

Berikut contoh konkret menggunakan Unix timestamp 1700000000, yang sesuai dengan 14 November 2023, 22:13:20 UTC. Kita akan mengonversinya ke "America/New_York" (UTC-5 di bulan November) dalam tiga bahasa pemrograman.

JavaScript

const ts = 1700000000;

// JavaScript Date menggunakan milidetik
const date = new Date(ts * 1000);

// Tampilkan dalam waktu lokal New York
const options = {
  timeZone: 'America/New_York',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  timeZoneName: 'short'
};

console.log(date.toLocaleString('en-US', options));
// Output: November 14, 2023 at 05:13:20 PM EST

Perlu diperhatikan bahwa objek Date di JavaScript menyimpan waktu secara internal sebagai milidetik UTC. Metode toLocaleString dengan opsi timeZone menangani offset dan aturan DST secara otomatis untuk kamu.

Python

from datetime import datetime, timezone
import zoneinfo  # Python 3.9+

ts = 1700000000

# Buat datetime yang sadar UTC dari timestamp
utc_dt = datetime.fromtimestamp(ts, tz=timezone.utc)

# Konversi ke waktu lokal New York
ny_tz = zoneinfo.ZoneInfo('America/New_York')
local_dt = utc_dt.astimezone(ny_tz)

print(local_dt.strftime('%Y-%m-%d %H:%M:%S %Z'))
# Output: 2023-11-14 17:13:20 EST

Kuncinya di sini adalah menggunakan datetime.fromtimestamp(ts, tz=timezone.utc). Jika kamu menghilangkan argumen tz, Python akan menggunakan timezone lokal server untuk menginterpretasikan timestamp - yang merupakan sumber bug yang umum terjadi.

PHP

$ts = 1700000000;

// Buat objek DateTime dari Unix timestamp (selalu UTC)
$dt = new DateTime('@' . $ts);

// Atur timezone target
$dt->setTimezone(new DateTimeZone('America/New_York'));

echo $dt->format('Y-m-d H:i:s T');
// Output: 2023-11-14 17:13:20 EST

Dalam PHP, awalan @ saat membuat objek DateTime memberitahu PHP untuk memperlakukan nilai tersebut sebagai Unix timestamp (UTC). Tanpanya, PHP mungkin menginterpretasikan string menggunakan pengaturan timezone default server.

Kesalahan Umum yang Dilakukan Developer

Bahkan developer berpengalaman pun bisa terjebak dalam penanganan timezone. Berikut masalah yang paling sering terjadi:

1. Mengasumsikan waktu lokal server adalah UTC

Jika server kamu diatur ke "Europe/Berlin" dan kamu memanggil time() di PHP atau datetime.now() di Python tanpa argumen timezone, kamu mendapatkan waktu lokal - bukan UTC. Selalu eksplisit tentang UTC saat mencatat timestamp.

2. Hardcoding UTC offset alih-alih menggunakan nama timezone

Menggunakan +02:00 sebagai offset tetap untuk Jerman akan bermasalah di musim dingin ketika Jerman beralih ke +01:00. Selalu gunakan timezone bernama seperti Europe/Berlin agar library bisa menerapkan aturan DST yang benar secara otomatis.

3. Menyimpan timestamp sebagai string waktu lokal tanpa metadata timezone

String seperti 2023-11-14 17:13:20 di database bersifat ambigu. Apakah itu UTC? EST? WIB? Jika kamu menyimpan timestamp sebagai integer Unix atau sebagai string ISO 8601 dengan UTC offset (misalnya, 2023-11-14T22:13:20Z), maknanya menjadi tidak ambigu. Lihat perbandingan kami tentang Format Unix Timestamp vs ISO 8601 untuk panduan memilih yang tepat.

4. Mengabaikan DST saat penjadwalan

Jika kamu menjadwalkan job untuk berjalan pada "09:00 setiap hari" dengan menambahkan 86400 detik ke waktu terakhir berjalan, ia akan meleset satu jam pada hari DST berubah. Gunakan library cron atau scheduler yang memahami aturan timezone.

5. Mencampuradukkan milidetik dan detik

JavaScript menggunakan milidetik untuk objek Date-nya, tetapi sebagian besar Unix timestamp dalam satuan detik. Memasukkan timestamp berbasis detik ke new Date() tanpa mengalikannya dengan 1000 akan menghasilkan tanggal di Januari 1970. Hal ini dibahas secara detail dalam artikel kami tentang Detik vs Milidetik vs Mikrodetik.

Kesimpulan

Unix timestamp dan UTC tidak dapat dipisahkan berdasarkan rancangannya. Timestamp selalu merupakan nilai UTC - hitungan detik dari titik acuan UTC yang tetap. Waktu lokal hanyalah format tampilan, bukan jenis timestamp yang berbeda. Pendekatan paling aman adalah menyimpan segalanya sebagai UTC, mengonversi ke waktu lokal hanya pada saat ditampilkan, dan selalu menggunakan timezone bernama daripada offset yang di-hardcode. Ikuti aturan-aturan ini dan sebagian besar bug terkait timezone tidak akan terjadi lagi. Untuk praktik terbaik dalam menyimpan nilai-nilai ini, lihat panduan kami tentang Unix Timestamp di Database.

Konversi Unix timestamp ke UTC atau waktu lokal dengan unixtimestamp.app

Konversi Unix Timestamp ke UTC atau Waktu Lokal - Seketika

Tempel Unix timestamp apa pun dan lihat hasilnya dikonversi ke UTC dan timezone lokal kamu dalam satu klik. Gratis, tanpa perlu daftar, dan mendukung format detik maupun milidetik.

Coba Alat Gratis Kami →

Ya. Berdasarkan definisinya, Unix epoch timestamp menghitung detik sejak 1 Januari 1970, 00:00:00 UTC. Angkanya sendiri tidak membawa timezone - ia adalah nilai UTC. Timezone baru menjadi relevan ketika kamu mengonversi timestamp menjadi tanggal dan waktu yang bisa dibaca manusia untuk keperluan tampilan.

Gunakan library timezone bawaan bahasa pemrograman kamu. Di JavaScript, gunakan toLocaleString dengan opsi timeZone. Di Python, gunakan datetime.fromtimestamp(ts, tz=timezone.utc).astimezone() dengan timezone bernama. Di PHP, buat DateTime dari timestamp dan panggil setTimezone(). Selalu gunakan timezone bernama, bukan offset mentah.

Ini biasanya terjadi karena sebuah fungsi menggunakan timezone default server alih-alih UTC saat menginterpretasikan timestamp. Di Python, menghilangkan argumen tz pada datetime.fromtimestamp() akan menggunakan waktu sistem lokal. Di PHP, tidak menggunakan awalan @ memiliki efek yang sama. Selalu eksplisit tentang UTC pada saat pembuatan.

UTC offset adalah jumlah jam (dan terkadang menit) yang menunjukkan seberapa jauh suatu timezone berada di depan atau di belakang UTC. Misalnya, UTC+07:00 berarti tujuh jam lebih cepat dari UTC, yang merupakan Waktu Indonesia Barat (WIB). Saat mengonversi Unix timestamp ke waktu lokal, offset diterapkan pada nilai UTC. Karena offset berubah mengikuti DST, sebaiknya gunakan timezone bernama daripada offset yang di-hardcode.

Ya, dan ini adalah salah satu keunggulan utama Unix timestamp. Karena setiap timestamp adalah nilai UTC, kamu bisa membandingkan dua timestamp mana pun secara langsung sebagai integer. Angka yang lebih besar selalu berarti titik waktu yang lebih belakangan, terlepas dari di mana timestamp tersebut dibuat. Tidak diperlukan konversi timezone untuk perbandingan.