Unix Timestamp UTC Dijelaskan: Zon Waktu, Offset & Penukaran

Peta dunia dengan garis zon waktu UTC dan cap masa Unix yang menghubungkan pelbagai jam tempatan

Jika awak pernah menyimpan tarikh dalam pangkalan data, membina API, atau menyahpepijat bug penjadualan yang hanya muncul di negara tertentu, awak pasti pernah berhadapan dengan hubungan antara Unix timestamp UTC dan waktu tempatan. Kekeliruan ini nyata dan boleh menyebabkan bug serius dalam persekitaran produksi. Artikel ini menjelaskan dengan tepat apa itu UTC, mengapa Unix timestamp sentiasa didefinisikan dalam UTC secara lalai, bagaimana offset zon waktu berfungsi, dan cara menukar timestamp dengan betul dalam JavaScript, Python, dan PHP. Awak juga akan temui kesilapan paling biasa yang dilakukan oleh pembangun dan cara mengelakkannya.

Perkara Utama:

  • Unix timestamp sentiasa mengira saat dari 1 Januari 1970, 00:00:00 UTC - ia tidak mempunyai zon waktu yang dilampirkan.
  • UTC adalah titik rujukan universal; waktu tempatan hanyalah UTC tambah atau tolak offset.
  • Menukar timestamp kepada waktu tempatan dengan betul memerlukan pengetahuan tentang zon waktu sasaran, bukan sekadar nombor offset.
  • DST (Daylight Saving Time) mengubah offset bagi sesebuah zon waktu, itulah sebabnya mengeraskan offset menyebabkan bug.

Apa Itu UTC dan Mengapa Ia Penting?

UTC bermaksud Coordinated Universal Time. Ia adalah piawaian masa utama yang digunakan oleh dunia untuk mengawal selia jam dan masa. Tidak seperti zon waktu, UTC tidak mempunyai offset - ia adalah titik sifar. UTC tidak mengamalkan Daylight Saving Time dan tidak berubah untuk mana-mana negara atau rantau.

Sebelum UTC, terdapat GMT (Greenwich Mean Time), dan ramai orang masih menggunakan kedua-dua istilah ini secara bergantian. Secara teknikal, UTC dan GMT berbeza sedikit, tetapi untuk kebanyakan tujuan perisian ia dianggap setara. UTC telah ditakrifkan secara rasmi melalui cadangan ITU-R TF.460 dan dikekalkan menggunakan jam atom.

Bagi pembangun, UTC penting kerana ia memberikan satu titik rujukan yang jelas dan tidak samar-samar. Jika pelayan awak di Frankfurt dan pengguna awak di Los Angeles kedua-duanya merekodkan sesuatu peristiwa menggunakan UTC, awak boleh sentiasa membandingkan kedua-dua timestamp tersebut dengan betul. Jika masing-masing merekodkan dalam waktu tempatan tanpa metadata, masalah pun timbul.

Mengapa Unix Timestamp Sentiasa UTC

Unix timestamp (juga dikenali sebagai epoch time atau POSIX time) ditakrifkan sebagai bilangan saat yang telah berlalu sejak 1 Januari 1970, 00:00:00 UTC. Titik permulaan itu - tengah malam pada 1 Januari 1970 dalam UTC - sudah tertanam dalam definisinya. Tidak ada versi Unix time yang bermula dalam waktu tempatan New York atau Tokyo.

Ini bermakna jawapan kepada soalan "adakah Unix timestamp sentiasa UTC?" adalah ya, mengikut definisi. Nombor 1700000000 mewakili detik masa yang sama persis untuk setiap orang di seluruh dunia. Apa yang berbeza antara pengguna ialah cara detik itu dipaparkan dalam zon waktu tempatan mereka.

Untuk memahami asas konsep ini dengan lebih mendalam, baca artikel kami tentang Epoch Time: Asas Unix Timestamp.

Reka bentuk berasaskan UTC ini adalah salah satu ciri paling berguna bagi Unix time. Kerana nombor itu sendiri tidak membawa sebarang maklumat zon waktu, dua sistem dari negara berbeza boleh bertukar timestamp dan kedua-duanya tahu dengan tepat detik mana yang dirujuk, tanpa sebarang rundingan tambahan.

UTC vs. Waktu Tempatan dan Zon Waktu

UTC adalah rujukan. Waktu tempatan ialah apa yang awak dapat apabila awak menerapkan peraturan zon waktu ke atasnya. Zon waktu bukan sekadar offset tetap - ia adalah kawasan bernama dengan satu set peraturan yang boleh berubah dari masa ke masa (kebanyakannya disebabkan oleh Daylight Saving Time).

Sebagai contoh, "Eastern Time" di Amerika Syarikat adalah UTC-5 pada musim sejuk dan UTC-4 pada musim panas. Nama zon waktu itu ialah "America/New_York" dalam pangkalan data zon waktu IANA, yang merupakan sumber autoriti untuk peraturan zon waktu yang digunakan oleh kebanyakan bahasa pengaturcaraan dan sistem pengendalian.

Kesimpulan praktikal: apabila awak menyimpan Unix timestamp dalam pangkalan data, awak sedang menyimpan nilai UTC. Apabila awak memaparkannya kepada pengguna, awak menukarnya kepada zon waktu tempatan mereka. Jangan sekali-kali menyimpan waktu tempatan sebagai nombor mentah dan menganggapnya sebagai UTC. Di situlah bug bermula.

Cara Offset UTC Berfungsi

Offset UTC menerangkan sejauh mana sesebuah zon waktu berbeza dari UTC. Ia ditulis sebagai +HH:MM atau -HH:MM. Beberapa contoh:

  • UTC+02:00 - Central European Summer Time (CEST), digunakan di Jerman dan Perancis semasa musim panas.
  • UTC-05:00 - Eastern Standard Time (EST), digunakan di Pantai Timur AS pada musim sejuk.
  • UTC+05:30 - India Standard Time (IST), yang merupakan offset setengah jam.
  • UTC+00:00 - UTC itu sendiri, juga digunakan oleh UK pada musim sejuk (GMT).

Untuk menukar epoch time UTC kepada waktu tempatan secara manual, awak tambah atau tolak offset dalam saat. Untuk UTC+02:00, itu adalah 2 * 3600 = 7200 saat. Jadi jika Unix timestamp awak ialah 1700000000, waktu tempatan dalam UTC+02:00 akan bersamaan dengan 1700000000 + 7200 sebelum pemformatan.

Walau bagaimanapun, melakukan ini secara manual adalah berisiko kerana offset berubah dengan DST. Sentiasa gunakan library zon waktu yang betul dan jangan mengeraskan offset. Lihat panduan kami tentang Cara Menukar Unix Timestamp kepada Tarikh untuk gambaran lebih mendalam tentang kaedah penukaran.

Menukar Unix Timestamp kepada Waktu Tempatan

Berikut adalah contoh konkrit menggunakan Unix timestamp 1700000000, yang bersamaan dengan 14 November 2023, 22:13:20 UTC. Kami akan menukarnya kepada "America/New_York" (UTC-5 pada November) dalam tiga bahasa pengaturcaraan.

JavaScript

const ts = 1700000000;

// JavaScript Date mengambil milisaat
const date = new Date(ts * 1000);

// Papar dalam waktu tempatan 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

Perhatikan bahawa objek Date dalam JavaScript menyimpan masa secara dalaman sebagai milisaat UTC. Kaedah toLocaleString dengan pilihan timeZone menguruskan offset dan peraturan DST untuk awak secara automatik.

Python

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

ts = 1700000000

# Cipta datetime yang sedar UTC daripada timestamp
utc_dt = datetime.fromtimestamp(ts, tz=timezone.utc)

# Tukar kepada waktu tempatan 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

Kunci di sini ialah menggunakan datetime.fromtimestamp(ts, tz=timezone.utc). Jika awak tidak menyertakan argumen tz, Python akan menggunakan zon waktu tempatan pelayan awak untuk mentafsir timestamp tersebut - yang merupakan punca bug yang sangat biasa.

PHP

$ts = 1700000000;

// Cipta objek DateTime daripada Unix timestamp (sentiasa UTC)
$dt = new DateTime('@' . $ts);

// Tetapkan zon waktu sasaran
$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 @ ketika membina objek DateTime memberitahu PHP untuk menganggap nilai tersebut sebagai Unix timestamp (UTC). Tanpanya, PHP mungkin mentafsir string itu menggunakan tetapan zon waktu lalai pelayan.

Kesilapan Biasa yang Dilakukan Pembangun

Walaupun pembangun berpengalaman sekalipun boleh tersalah langkah dalam pengendalian zon waktu. Berikut adalah isu yang paling kerap berlaku:

1. Menganggap waktu tempatan pelayan adalah UTC

Jika pelayan awak ditetapkan kepada "Europe/Berlin" dan awak memanggil time() dalam PHP atau datetime.now() dalam Python tanpa argumen zon waktu, awak mendapat waktu tempatan - bukan UTC. Sentiasa nyatakan UTC secara eksplisit ketika merekodkan timestamp.

2. Mengeraskan offset UTC bukannya menggunakan nama zon waktu

Menggunakan +02:00 sebagai offset tetap untuk Jerman akan rosak pada musim sejuk apabila Jerman bertukar kepada +01:00. Sentiasa gunakan nama zon waktu seperti Europe/Berlin supaya library boleh menerapkan peraturan DST yang betul secara automatik.

3. Menyimpan timestamp sebagai string waktu tempatan tanpa metadata zon waktu

String seperti 2023-11-14 17:13:20 dalam pangkalan data adalah samar-samar. Adakah ia UTC? EST? IST? Jika awak menyimpan timestamp sebagai integer Unix atau sebagai string ISO 8601 dengan offset UTC (contoh: 2023-11-14T22:13:20Z), maknanya adalah jelas. Lihat perbandingan kami tentang Format Unix Timestamp vs ISO 8601 untuk panduan memilih yang mana satu.

4. Mengabaikan DST semasa penjadualan

Jika awak menjadualkan tugasan untuk berjalan pada "09:00 setiap hari" dengan menambah 86400 saat kepada masa jalan terakhir, ia akan tersasar satu jam pada hari DST berubah. Gunakan library cron atau penjadual yang memahami peraturan zon waktu.

5. Mengelirukan milisaat dan saat

JavaScript menggunakan milisaat untuk objek Date-nya, tetapi kebanyakan Unix timestamp adalah dalam saat. Menghantar timestamp berasaskan saat kepada new Date() tanpa mendarabkannya dengan 1000 akan menghasilkan tarikh pada Januari 1970. Perkara ini dibincangkan secara terperinci dalam artikel kami tentang Saat vs Milisaat vs Mikrosaat.

Kesimpulan

Unix timestamp dan UTC tidak boleh dipisahkan mengikut reka bentuk. Timestamp sentiasa merupakan nilai UTC - kiraan saat dari titik permulaan UTC yang tetap. Waktu tempatan hanyalah format paparan, bukan sejenis timestamp yang berbeza. Pendekatan paling selamat ialah menyimpan segala-galanya sebagai UTC, menukar kepada waktu tempatan hanya pada titik paparan, dan sentiasa menggunakan nama zon waktu berbanding offset yang dikeraskan. Ikuti peraturan ini dan majoriti bug berkaitan zon waktu akan berhenti berlaku. Untuk amalan terbaik dalam menyimpan nilai-nilai ini, lihat panduan kami tentang Unix Timestamp dalam Pangkalan Data.

Tukar Unix timestamp kepada UTC atau waktu tempatan dengan unixtimestamp.app

Tukar Mana-mana Unix Timestamp kepada UTC atau Waktu Tempatan - Serta-merta

Tampal mana-mana Unix timestamp dan lihat ia ditukar kepada UTC dan zon waktu tempatan awak dalam satu klik. Percuma, tiada pendaftaran diperlukan, dan berfungsi dengan saat dan milisaat.

Cuba Alat Percuma Kami →

Ya. Mengikut definisi, Unix epoch timestamp mengira saat dari 1 Januari 1970, 00:00:00 UTC. Nombor itu sendiri tidak membawa sebarang zon waktu - ia adalah nilai UTC. Zon waktu hanya menjadi relevan apabila awak menukar timestamp kepada tarikh dan masa yang boleh dibaca manusia untuk tujuan paparan.

Gunakan library zon waktu terbina dalam bahasa pengaturcaraan awak. Dalam JavaScript, gunakan toLocaleString dengan pilihan timeZone. Dalam Python, gunakan datetime.fromtimestamp(ts, tz=timezone.utc).astimezone() dengan nama zon waktu. Dalam PHP, cipta DateTime daripada timestamp dan panggil setTimezone(). Sentiasa gunakan nama zon waktu, bukan offset mentah.

Ini biasanya berlaku kerana sesuatu fungsi menggunakan zon waktu lalai pelayan dan bukannya UTC ketika mentafsir timestamp. Dalam Python, tidak menyertakan argumen tz kepada datetime.fromtimestamp() akan menggunakan waktu sistem tempatan. Dalam PHP, tidak menggunakan awalan @ memberi kesan yang sama. Sentiasa nyatakan UTC secara eksplisit pada titik penciptaan.

Offset UTC ialah bilangan jam (dan kadangkala minit) yang sesebuah zon waktu berada di hadapan atau di belakang UTC. Sebagai contoh, UTC-05:00 adalah lima jam di belakang UTC. Ketika menukar Unix timestamp kepada waktu tempatan, offset diterapkan kepada nilai UTC. Oleh kerana offset berubah dengan DST, awak sepatutnya menggunakan nama zon waktu berbanding offset yang dikeraskan.

Ya, dan inilah salah satu kelebihan utama Unix timestamp. Kerana setiap timestamp adalah nilai UTC, awak boleh membandingkan mana-mana dua timestamp secara langsung sebagai integer. Nombor yang lebih besar sentiasa bermakna titik masa yang lebih lewat, tanpa mengira di mana timestamp tersebut dijana. Tiada penukaran zon waktu diperlukan untuk perbandingan.