Masa kelihatan mudah sehingga anda cuba menulis perisian yang mengendalikannya dengan betul. Acara yang dijadualkan pada "3 PTG" bermaksud perkara yang berbeza di Tokyo, London, dan New York. Penjimatan siang mengalih jam ke hadapan atau ke belakang — tetapi bukan di mana-mana, dan bukan pada tarikh yang sama. Cap masa yang kelihatan betul dalam persekitaran tempatan anda rosak dalam pengeluaran kerana pelayan berada di zon yang berbeza.
Zon waktu adalah salah satu topik yang secara konsisten mengelirukan dalam pembangunan perisian. Artikel ini menerangkan cara ia berfungsi, dari mana kerumitan itu datang, dan cara mengelakkan kesilapan yang paling biasa.
Mengapa zon waktu wujud
Bumi berputar 360 darjah dalam 24 jam, bermakna matahari berada di titik tertinggi pada saat yang berbeza bergantung pada longitud anda. Sebelum abad ke-19, setiap bandar menetapkan jamnya mengikut waktu solar tempatan — tengah hari ialah apabila matahari berada di atas kepala. Ini berfungsi dengan baik sehingga landasan kereta api menghubungkan bandar-bandar yang jauh dan jadual kereta api memerlukan satu jam yang konsisten.
Pada 1884, delegasi dari 25 negara bertemu di Persidangan Meridian Antarabangsa di Washington, D.C. dan bersetuju membahagikan dunia kepada 24 zon waktu standard, setiap satu diofsetkan daripada meridian utama (longitud 0 darjah) yang melalui Greenwich, England.
Dalam amalan, sempadan zon waktu mengikut sempadan politik, bukan garisan longitud yang kemas. China merangkumi lima zon geografi tetapi menggunakan satu waktu rasmi (UTC+8). India menggunakan UTC+5:30 — ofset setengah jam. Nepal menggunakan UTC+5:45. Peta zon waktu dunia sebenar adalah rumit.
UTC lawan GMT
GMT (Greenwich Mean Time) ialah waktu solar purata di Balai Cerap Diraja di Greenwich. Ia menjadi rujukan waktu dunia selama lebih satu abad.
UTC (Coordinated Universal Time) menggantikan GMT sebagai standard antarabangsa pada 1972. UTC berdasarkan jam atom dan bukannya pemerhatian astronomi, menjadikannya jauh lebih tepat. Untuk kebanyakan tujuan praktikal, UTC dan GMT menunjukkan waktu yang sama, tetapi UTC ialah rujukan teknikal yang betul.
Mengapa "UTC" dan bukan "CUT"? Singkatan ini ialah kompromi antara Inggeris "Coordinated Universal Time" (CUT) dan Perancis "Temps Universel Coordonné" (TUC). Kedua-dua pihak tidak mendapat singkatan pilihan mereka, jadi UTC dipilih sebagai alternatif neutral bahasa.
Penjimatan siang: kekacauan terancang
Kira-kira 70 negara mematuhi penjimatan siang (DST), mengalih jam ke hadapan satu jam pada musim bunga dan ke belakang pada musim luruh. Tujuannya ialah menyelaraskan waktu bangun dengan cahaya siang. Hasilnya ialah sumber pepijat dua kali setahun.
Komplikasi utama:
- Tidak universal. Kebanyakan Afrika, Asia, dan Amerika Selatan tidak mematuhi DST. Di AS, Arizona dan Hawaii tidak mengamalkannya.
- Tarikh berbeza. EU beralih pada Ahad terakhir Mac dan Oktober. AS beralih pada Ahad kedua Mac dan Ahad pertama November. Mereka tidak selari selama beberapa minggu setiap tahun.
- Waktu samar. Apabila jam mundur, jam dari 1:00 PG hingga 2:00 PG berlaku dua kali. Cap masa "1:30 PG" pada hari itu adalah samar.
- Waktu dilangkau. Apabila jam maju, jam dari 2:00 PG hingga 3:00 PG tidak wujud. Mesyuarat yang dijadualkan pada 2:30 PG pada hari itu tidak pernah berlaku.
- Perubahan politik. Kerajaan boleh (dan memang) menukar peraturan DST dengan sedikit notis. Rusia mengguna pakai DST kekal pada 2011, kemudian bertukar kepada waktu standard kekal pada 2014. Maghribi telah menukar peraturan DST beberapa kali.
ISO 8601: format tarikh universal
Untuk mengelakkan kesamaran, standard antarabangsa ISO 8601 mentakrifkan format tarikh dan masa yang jelas:
2026-03-29T14:30:00Z
2026-03-29T14:30:00+02:00
2026-03-29T14:30:00-05:00
Tmemisahkan tarikh daripada masa.Zbermaksud UTC (zon waktu "Zulu" dalam terminologi tentera).+02:00atau-05:00ialah ofset UTC.
Format ini tidak samar, boleh diisih sebagai teks biasa, dan difahami secara universal oleh perpustakaan penghuraian tarikh. Jika ragu-ragu, gunakan ISO 8601.
Cap masa Unix
Cap masa Unix (juga dipanggil epoch time atau POSIX time) ialah bilangan saat yang telah berlalu sejak 1 Januari 1970, 00:00:00 UTC — satu saat yang dikenali sebagai Unix epoch.
| Boleh dibaca manusia | Cap masa Unix |
|---|---|
| 1970-01-01 00:00:00 UTC | 0 |
| 2000-01-01 00:00:00 UTC | 946684800 |
| 2026-03-29 12:00:00 UTC | 1774987200 |
Cap masa Unix tidak mempunyai zon waktu — ia sentiasa dalam UTC. Ini menjadikannya ideal untuk menyimpan dan membandingkan masa dalam perisian. Anda menukar kepada zon waktu tempatan hanya pada lapisan paparan.
Masalah Tahun 2038: Sistem yang menyimpan cap masa Unix sebagai integer bertanda 32-bit akan melimpah pada 19 Januari 2038 pada 03:14:07 UTC. Nilai maksimum (2,147,483,647) bertukar kepada nombor negatif, ditafsirkan sebagai Disember 1901. Kebanyakan sistem moden menggunakan integer 64-bit, yang tidak akan melimpah untuk 292 bilion tahun lagi.
Pangkalan data zon waktu IANA
Perisian bukan sahaja memerlukan ofset UTC — ia perlu mengetahui sejarah penuh dan peraturan masa depan untuk setiap wilayah, termasuk peralihan DST, perubahan politik, dan anomali sejarah. Maklumat ini terdapat dalam Pangkalan Data Zon Waktu IANA (juga dipanggil pangkalan data Olson atau tzdata).
Ia menggunakan pengenal pasti seperti America/New_York, Europe/Paris, Asia/Tokyo. Setiap entri mengekodkan sejarah lengkap ofset UTC dan peraturan DST untuk lokasi tersebut.
Inilah sebabnya anda jangan sekali-kali menyimpan zon waktu sebagai ofset tetap seperti "+02:00". Ofset memberitahu anda perbezaan semasa daripada UTC tetapi tidak mengatakan apa-apa tentang peraturan DST. Europe/Paris ialah UTC+1 pada musim sejuk dan UTC+2 pada musim panas. Pengenal pasti IANA menangkap kedua-duanya.
Pepijat biasa dalam perisian
- Menyimpan waktu tempatan tanpa zon waktu. Nilai seperti
2026-03-29 14:30:00tidak bermakna tanpa mengetahui zon waktu mana yang dirujuk. Sentiasa simpan UTC atau sertakan ofset. - Menganggap ofset UTC sama dengan zon waktu. UTC+2 pada Mac mungkin UTC+3 pada Julai (jika wilayah mematuhi DST). Simpan pengenal pasti IANA, bukan ofset.
- Mengabaikan peralihan DST dalam penjadualan. Tugas harian pada 2:30 PG akan dilangkau sekali setahun dan berjalan dua kali sekali setahun jika anda tidak mengendalikan DST.
- Menganggap hari mempunyai 24 jam. Pada hari peralihan DST, sehari mempunyai 23 atau 25 jam. Mengira "esok pada masa yang sama" dengan menambah 86,400 saat akan terkeluar satu jam.
- Menggunakan JavaScript
Datesecara naif.new Date("2026-03-29")dihuraikan sebagai UTC dalam sesetengah enjin dan sebagai waktu tempatan dalam yang lain. Sentiasa nyatakan zon waktu secara eksplisit.
Amalan terbaik untuk pembangun
- Simpan masa dalam UTC. Tukar kepada zon waktu tempatan pengguna hanya pada lapisan persembahan.
- Gunakan pengenal pasti zon waktu IANA (
America/New_York), bukan ofset tetap (-05:00). - Gunakan ISO 8601 untuk siri. Ia tidak samar dan boleh dihuraikan secara universal.
- Gunakan perpustakaan tarikh yang matang. Dalam JavaScript, gunakan
Intl.DateTimeFormatatau perpustakaan sepertidate-fns-tz. Dalam Python, gunakanzoneinfo(3.9+) ataupytz. Dalam Java, gunakanjava.time.ZonedDateTime. - Pastikan
tzdatadikemas kini. Kerajaan menukar peraturan DST. Sistem pengendalian dan runtime bahasa anda memerlukan data zon waktu terkini. - Uji dengan berbilang zon waktu. Jangan anggap pelayan dan pengguna anda berkongsi zon yang sama.
Lebih lanjut
Masa secara mengelirukan adalah kompleks, tetapi peraturannya didokumentasikan dengan baik dan alatnya matang. Kuncinya ialah menghormati kerumitan dan bukannya menganggapnya tidak wujud.
- Ungkapan Cron Diterangkan — penjadualan tugas merentas zon waktu
- Penjana Hash dan Penguji Regex — lebih banyak alat pembangun di ToolK
