Cara Mengonversi Antar Zona Waktu
Konversi zona waktu gagal dengan dua cara: salah offset, atau mengabaikan daylight saving time (DST). New York adalah UTC−5 di musim dingin dan UTC−4 di musim panas. "5 PM EST" di bulan Februari menggunakan offset UTC berbeda dari "5 PM EDT" di bulan Juli. Alat dan kode yang memaksa offset tetap akan salah.
Di browser
Masukkan waktu dan pilih dua zona di Time Zone Converter untuk melihat nilai setaranya. Konverter menggunakan data timezone IANA, sehingga transisi DST ditangani otomatis — tidak perlu penyesuaian offset manual.
Offset UTC untuk zona waktu umum
| Kota | Zona IANA | Offset standar | Offset DST |
|---|---|---|---|
| New York | America/New_York | UTC−5 | UTC−4 |
| London | Europe/London | UTC+0 | UTC+1 |
| Paris | Europe/Paris | UTC+1 | UTC+2 |
| Dubai | Asia/Dubai | UTC+4 | — (tanpa DST) |
| Mumbai | Asia/Kolkata | UTC+5:30 | — (tanpa DST) |
| Singapura | Asia/Singapore | UTC+8 | — (tanpa DST) |
| Tokyo | Asia/Tokyo | UTC+9 | — (tanpa DST) |
| Sydney | Australia/Sydney | UTC+10 | UTC+11 |
| Jakarta | Asia/Jakarta | UTC+7 | — (tanpa DST) |
Gunakan nama zona IANA (America/New_York) bukan singkatan (EST). EST ambigu — merujuk ke zona berbeda di Amerika Utara dan Australia.
Python
Python 3.9+ menyertakan zoneinfo di pustaka standar. Tidak perlu paket pihak ketiga.
from datetime import datetime
from zoneinfo import ZoneInfo
# Buat datetime yang mengetahui zona waktu
ny_time = datetime(2026, 3, 15, 14, 30, tzinfo=ZoneInfo('America/New_York'))
# Konversi ke zona lain
london = ny_time.astimezone(ZoneInfo('Europe/London'))
tokyo = ny_time.astimezone(ZoneInfo('Asia/Tokyo'))
print(f'New York: {ny_time:%Y-%m-%d %H:%M %Z}')
print(f'London: {london:%Y-%m-%d %H:%M %Z}')
print(f'Tokyo: {tokyo:%Y-%m-%d %H:%M %Z}')
# Konversi waktu UTC saat ini ke beberapa zona
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
now_utc = datetime.now(timezone.utc)
zones = ['America/New_York', 'Europe/London', 'Asia/Singapore', 'Asia/Jakarta']
for tz in zones:
local = now_utc.astimezone(ZoneInfo(tz))
print(f'{tz:<25} {local:%Y-%m-%d %H:%M %Z}')
JavaScript
// Konversi tanggal ke timezone tertentu
function convertToTimezone(date, timezone) {
return new Intl.DateTimeFormat('id-ID', {
timeZone: timezone,
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false,
}).format(date);
}
const now = new Date();
console.log(convertToTimezone(now, 'America/New_York'));
console.log(convertToTimezone(now, 'Asia/Jakarta'));
console.log(convertToTimezone(now, 'Asia/Tokyo'));
// Dapatkan offset UTC saat ini (dalam menit) untuk timezone apa pun
function getUtcOffsetMinutes(timezone, date = new Date()) {
const utc = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
const tz = new Date(date.toLocaleString('en-US', { timeZone: timezone }));
return (tz - utc) / 60000;
}
console.log(getUtcOffsetMinutes('America/New_York')); // -300 atau -240 tergantung DST
console.log(getUtcOffsetMinutes('Asia/Jakarta')); // selalu 420
Jebakan naive datetime
datetime Python tanpa info timezone bersifat naive — tidak mengenal DST. Operasi aritmatika pada naive datetime menghasilkan hasil salah saat melewati transisi DST.
from datetime import datetime, timedelta
# Salah — naive datetime pada hari pergantian DST AS (jam maju 1 jam pukul 2 pagi)
dt = datetime(2026, 3, 8, 1, 0)
print(dt + timedelta(hours=2)) # Menampilkan 3:00 AM, padahal waktu lokal lompat ke 3 AM saat pukul 2 AM
# Benar — datetime yang mengetahui zona waktu
from zoneinfo import ZoneInfo
dt = datetime(2026, 3, 8, 1, 0, tzinfo=ZoneInfo('America/New_York'))
print(dt + timedelta(hours=2)) # Memperhitungkan celah DST dengan benar
Selalu lampirkan timezone saat membuat datetime yang akan digunakan untuk aritmatika.
Menyimpan dan mengirimkan waktu
| Pendekatan | Masalah |
|---|---|
Simpan sebagai EST / PST |
Singkatan ambigu, DST tidak terencode |
Simpan sebagai offset UTC (-05:00) |
Tidak merepresentasikan perilaku DST di masa depan |
| Simpan sebagai UTC + nama zona IANA | Benar — tidak ambigu, DST ditangani |
Untuk database: simpan timestamp UTC. Simpan nama zona IANA secara terpisah jika perlu menampilkan waktu lokal. Rekonstruksi waktu lokal saat pembacaan data.
Poin utama
- Gunakan nama zona IANA (
America/New_York) — singkatan sepertiESTambigu di berbagai benua. zoneinfoPython 3.9+ menangani DST otomatis; tidak perlupytzuntuk proyek modern.- Naive datetime menghasilkan hasil salah saat melewati batas DST — selalu lampirkan timezone.
- Dubai, Mumbai, Singapura, dan Tokyo tidak memiliki DST — offsetnya tetap sepanjang tahun.
- Simpan timestamp sebagai UTC di database; rekonstruksi waktu lokal dengan nama zona IANA saat ditampilkan.