0Pricing
Coding Interview Prep · Pelajaran

Zona Waktu dan Stempel Waktu

Menyimpan UTC, mengonversi zona, serta memahami jebakan terkait stempel waktu yang sering ditanyakan pewawancara.

Zona Waktu dan Stempel Waktu adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Mengapa Zona Waktu Membuat Kandidat Terkecoh

Zona waktu adalah bagian yang membuat kandidat yang percaya diri pun tersandung, sehingga pewawancara menanyakannya untuk menemukan pemahaman yang mendalam. Pertanyaan intinya selalu: "bagaimana Anda menyimpan dan membandingkan stempel waktu dari berbagai wilayah?"

Jawaban profesionalnya adalah sebuah disiplin, bukan fungsi: simpan semuanya dalam UTC, dan lakukan konversi hanya di batas sistem untuk ditampilkan. Jika model penyimpanan sudah benar, sebagian besar kueri menjadi mudah.

  • stempel waktu vs stempel waktu dengan zona waktu
  • Konversi antar zona
  • UTC sebagai sumber acuan

Stempel Waktu vs Stempel Waktu dengan Zona Waktu

PostgreSQL memiliki dua jenis stempel waktu, dan salah membedakannya merupakan kesalahan umum dalam wawancara.

  • timestamp (tanpa zona waktu): nilai jam dinding tanpa zona yang melekat. Nilai yang diberikan disimpan persis seperti itu.
  • timestamptz (dengan zona waktu): disimpan secara internal sebagai UTC; saat masukan diterima, nilainya dikonversi dari zona sesi, dan saat keluaran diberikan, nilainya dikonversi kembali.

Meskipun namanya demikian, timestamptz tidak menyimpan zona; tipe ini menyimpan suatu saat yang tepat dalam UTC. Detail ini dapat mengesankan pewawancara.

CREATE TABLE events (
  id          bigint,
  occurred_at timestamptz   -- recommended: an absolute instant
);

Simpan dalam UTC, Konversi di Batas Sistem

Aturan utamanya: simpan titik waktu dalam UTC (gunakan timestamptz), dan konversikan ke zona lokal hanya saat menyajikannya kepada pengguna. Hal ini menghindari kerancuan terkait perubahan waktu musim panas dan membuat pengurutan berdasarkan waktu benar di mana pun.

Jika ditanya "mengapa UTC?", jawab: UTC tidak mengalami perubahan waktu musim panas, sehingga nilai jam dinding yang sama tidak pernah muncul dua kali atau terlewati, tidak seperti waktu lokal.

-- Display a UTC instant in a user's zone (Postgres)
SELECT occurred_at AT TIME ZONE 'America/New_York' AS local_time
FROM events;

Makna Ganda AT TIME ZONE

AT TIME ZONE cerdik dan sering menjadi jebakan karena melakukan dua hal yang berlawanan, bergantung pada jenis masukan:

  • Diterapkan pada timestamptz, fungsi ini mengonversi momen absolut ke zona tersebut dan menghasilkan timestamp biasa (waktu pada jam lokal di sana).
  • Diterapkan pada timestamp biasa, fungsi ini menafsirkan waktu pada jam lokal tersebut sebagai waktu di zona itu dan menghasilkan timestamptz.

Kuncinya adalah mengetahui arah operasinya.

-- timestamptz -> local wall clock (returns timestamp)
SELECT TIMESTAMPTZ '2024-03-01 12:00:00+00'
         AT TIME ZONE 'Asia/Tokyo';        -- 2024-03-01 21:00:00

-- plain timestamp interpreted in a zone (returns timestamptz)
SELECT TIMESTAMP '2024-03-01 12:00:00'
         AT TIME ZONE 'Asia/Tokyo';        -- 2024-03-01 03:00:00+00

Mendapatkan Momen Waktu Saat Ini

Pahami fungsi waktu "sekarang" Anda. NOW() dan CURRENT_TIMESTAMP menghasilkan timestamptz di Postgres. Keduanya mengembalikan waktu dimulainya transaksi, bukan waktu pernyataannya, dan perbedaan ini penting dalam transaksi yang panjang.

Untuk mendapatkan UTC secara eksplisit, lakukan konversi: NOW() AT TIME ZONE 'UTC'. Di MySQL, UTC_TIMESTAMP() langsung memberikan UTC.

SELECT
  NOW()                       AS tx_start_tz,
  NOW() AT TIME ZONE 'UTC'    AS utc_walltime;

Waktu Musim Panas Adalah Musuh Sebenarnya

Pewawancara menyukai kasus tepi DST. Saat jam dimajukan, satu jam pada waktu lokal tidak ada; saat jam dimundurkan, satu jam berulang. Menyimpan waktu lokal membuat waktu-waktu tersebut ambigu atau tidak valid.

Menyimpan UTC menghindari masalah ini sepenuhnya: setiap momen bersifat unik dan monoton. Menentukan nama wilayah seperti 'America/New_York' (bukan selisih tetap seperti -05:00) memungkinkan basis data menerapkan aturan DST dengan benar untuk tanggal apa pun.

-- Region name applies DST automatically for the given date
SELECT TIMESTAMPTZ '2024-07-01 12:00:00+00'
         AT TIME ZONE 'America/New_York' AS summer, -- EDT (-04)
       TIMESTAMPTZ '2024-01-01 12:00:00+00'
         AT TIME ZONE 'America/New_York' AS winter; -- EST (-05)

Mengelompokkan Berdasarkan Hari Lokal di Berbagai Zona

Berikut masalah yang realistis: "pengguna aktif harian berdasarkan waktu lokal setiap pengguna." Jika Anda langsung memotong stempel waktu UTC, batas tengah malam akan keliru bagi pengguna yang berada di luar UTC.

Konversikan ke zona pengguna sebelum memotongnya menjadi hari. Konversi ini menggeser waktu pada jam lokal sehingga batas hari selaras dengan waktu setempat.

SELECT
  DATE_TRUNC('day', occurred_at AT TIME ZONE u.tz) AS local_day,
  COUNT(DISTINCT e.user_id)                         AS dau
FROM events e
JOIN users u ON u.id = e.user_id
GROUP BY 1
ORDER BY 1;

Membandingkan Stempel Waktu dengan Aman

Saat menyaring kolom timestamptz, bandingkan dengan momen waktu yang eksplisit, idealnya literal UTC atau timestamptz dengan selisih waktu. Membandingkan dengan teks biasa dapat membuatnya ditafsirkan berdasarkan zona sesi yang tidak dapat diprediksi.

Dengan demikian, perbandingan tetap tidak ambigu, siapa pun yang menjalankan kueri tersebut.

SELECT *
FROM events
WHERE occurred_at >= TIMESTAMPTZ '2024-03-01 00:00:00+00'
  AND occurred_at <  TIMESTAMPTZ '2024-04-01 00:00:00+00';

Era Unix dan Stempel Waktu Unix

Banyak sistem menyimpan waktu sebagai era Unix (jumlah detik sejak 1970-01-01 UTC). Pewawancara mungkin memberikan kolom bilangan bulat dan meminta Anda membacanya.

  • Postgres: TO_TIMESTAMP(epoch_seconds) menghasilkan timestamptz.
  • Kembali ke era Unix: EXTRACT(EPOCH FROM occurred_at).
  • MySQL: FROM_UNIXTIME() dan UNIX_TIMESTAMP().

Nilai era Unix pada dasarnya menggunakan UTC, dan itulah salah satu alasan nilai tersebut populer untuk penyimpanan.

SELECT
  TO_TIMESTAMP(1709294400)               AS as_ts,   -- from epoch
  EXTRACT(EPOCH FROM NOW())::bigint        AS as_epoch; -- to epoch

Catatan Zona Waktu Lintas Dialek

Berikut ringkasan singkat agar Anda terlihat menguasai lingkungan apa pun:

  • Postgres: timestamptz + AT TIME ZONE, dengan dukungan paling lengkap.
  • MySQL: TIMESTAMP dikonversi otomatis melalui time_zone sesi; CONVERT_TZ(t, from, to) melakukan konversi secara eksplisit. DATETIME tidak mengetahui zona waktu.
  • SQL Server: datetimeoffset menyimpan selisih waktu; AT TIME ZONE 'name' melakukan konversi menggunakan nama zona Windows.
-- MySQL explicit conversion
SELECT CONVERT_TZ(event_dt, 'UTC', 'Europe/Istanbul') AS local_dt
FROM events;

Contoh Lebih Mendalam: Sesi yang Melampaui Tengah Malam

Berikut pertanyaan pelaporan yang cukup rumit: menghitung sesi per hari kalender lokal ketika sebuah sesi dapat melampaui tengah malam. Solusinya mengikuti disiplin yang sama: konversikan ke waktu lokal, lalu kelompokkan.

Simpan waktu mulai dan selesai sebagai timestamptz; untuk pelaporan, tentukan hari lokal berdasarkan waktu mulai yang telah dikonversi. Jika sebuah sesi harus dibagi ke dua hari, Anda dapat menggabungkannya dengan rangkaian hari, dan ini merupakan hal bagus untuk disebutkan sebagai pertanyaan lanjutan.

SELECT
  DATE_TRUNC('day', started_at AT TIME ZONE 'Europe/Istanbul') AS local_day,
  COUNT(*) AS sessions
FROM sessions
GROUP BY 1
ORDER BY 1;

Pemeriksaan Singkat

Konfirmasikan strategi penyimpanan yang disarankan dan alasannya.

Ringkasan: Zona Waktu dan Stempel Waktu

Berikut prinsip yang perlu Anda ingat:

  • Simpan UTC sebagai timestamptz; konversikan ke zona yang memiliki nama hanya untuk tampilan.
  • timestamptz menyimpan momen UTC, bukan zona, meskipun namanya demikian.
  • AT TIME ZONE bekerja dalam dua arah bergantung pada jenis masukan: fungsi ini mengonversi timestamptz menjadi waktu pada jam lokal, atau menafsirkan timestamp biasa sebagai waktu di suatu zona.
  • Gunakan nama wilayah ('America/New_York') agar DST diterapkan secara otomatis; hindari selisih tetap.
  • Konversikan ke waktu lokal sebelum memotongnya menjadi hari, dan bandingkan kolom dengan momen UTC yang eksplisit.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Zona Waktu dan Stempel Waktu” gratis?

Ya — teks lengkap “Zona Waktu dan Stempel Waktu” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Zona Waktu dan Stempel Waktu”?

Menyimpan UTC, mengonversi zona, serta memahami jebakan terkait stempel waktu yang sering ditanyakan pewawancara. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Zona Waktu dan Stempel Waktu” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Aritmetika Tanggal dan Interval
  2. Memotong dan Mengelompokkan Tanggal
  3. Mengurai dan Memformat String
  4. Zona Waktu dan Stempel Waktu
← Kembali ke Coding Interview Prep