All Tools / Blog / Cara Mengonversi Antar Zona Waktu

Cara Mengonversi Antar Zona Waktu

3 min read

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 seperti EST ambigu di berbagai benua.
  • zoneinfo Python 3.9+ menangani DST otomatis; tidak perlu pytz untuk 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.