Artikel
Timestamp Unix dan ekspresi cron, dijelaskan
Timestamp Unix hanyalah sebuah bilangan bulat. Ekspresi cron hanyalah lima bidang. Keduanya muncul terus-menerus dalam pekerjaan backend, dan keduanya membingungkan orang dengan cara yang dapat diprediksi: satu karena zona waktu, yang lain karena satuannya.
Apa itu timestamp Unix
Timestamp Unix menghitung jumlah detik yang telah berlalu sejak 1970-01-01 00:00:00 UTC, titik referensi yang dikenal sebagai Unix epoch. Definisi tersebut memiliki dua konsekuensi penting. Pertama, hitungan dalam UTC: tidak ada zona waktu yang tertanam dalam angka itu sendiri. 1718400000 berarti saat yang sama di mana pun di Bumi terlepas dari di mana mesin yang menyimpannya berada. Kedua, epoch didefinisikan dalam detik, bukan dalam satuan lain. Nilai seperti 1718400000 selalu merupakan detik sejak tengah malam 1 Januari 1970 UTC, kecuali jika sistem atau protokol telah membuat pilihan yang berbeda secara eksplisit. Timestamp bebas zona waktu berdasarkan desain, itulah tepatnya mengapa timestamp berguna untuk pencatatan, basis data, dan komunikasi antar sistem di mana jam di berbagai wilayah harus merujuk ke momen yang sama secara tidak ambigu.

Detik, milidetik, dan masalah year-2038
Banyak runtime dan API modern menggunakan milidetik daripada detik. Date.now() JavaScript mengembalikan milidetik, sehingga 1718400000000 adalah saat yang sama dengan nilai presisi-detik 1718400000. Ketika Anda menerima timestamp yang tidak dikenal, besarannya memberi tahu Anda satuannya: angka 10 digit hampir selalu merupakan detik; angka 13 digit hampir selalu merupakan milidetik. Masalah year-2038 muncul dari pilihan yang berbeda: menyimpan timestamp presisi-detik dalam bilangan bulat bertanda 32-bit. Nilai maksimum bilangan bulat bertanda 32-bit adalah 2147483647, yang sesuai dengan 2038-01-19 03:14:07 UTC. Setelah detik itu, penghitung meluap menjadi angka negatif besar dan tanggal bergulir kembali ke 1901 pada sistem yang tidak menangani batasnya. Perbaikannya adalah menggunakan penyimpanan 64-bit. Sebagian besar sistem operasi dan basis data saat ini sudah melakukannya, tetapi sistem tertanam, perangkat jaringan, dan format file lama yang menetapkan lebar bidang puluhan tahun lalu tetap berisiko.
Mengonversi epoch ke tanggal manusiawi: langkah zona waktu
Mengonversi nilai epoch menjadi tanggal yang dapat dibaca memerlukan dua langkah: ambil komponen tanggal UTC dari bilangan bulat, lalu terapkan offset UTC untuk mendapatkan waktu lokal. Timestamp itu sendiri adalah UTC. Ketika Anda bertanya tanggal apa yang diwakili oleh 1718325000, jawaban yang benar adalah 2024-06-14 pukul 00:30 dalam UTC. Di New York (UTC-4 di musim panas), detik yang sama jatuh pada 2024-06-13 pukul 20:30 malam sebelumnya: tanggalnya berubah, bukan hanya jamnya. Ini adalah langkah yang menghasilkan hasil salah jika dilewati: seorang pengembang mencatat timestamp mentah dalam UTC, alat pelaporan merendernya dalam waktu lokal tanpa konversi, dan tanggal tampak meleset beberapa jam atau satu hari penuh. Alat timestamp-converter di Sunasty menangani ini secara eksplisit: Anda memasukkan nilai epoch dan alat menampilkan tanggal serta waktu UTC berdampingan dengan tanggal dan waktu lokal perangkat Anda sendiri, sehingga pergeseran batas hari seperti ini terlihat sekilas. Konversi berjalan sepenuhnya di browser dan tidak ada yang Anda tempel dikirim ke mana pun.

Sintaks cron: lima bidang, rentang, langkah, dan daftar
Ekspresi cron menjadwalkan pekerjaan berulang pada sistem mirip Unix. Sintaks standar memiliki lima bidang yang dipisahkan spasi: menit (0-59), jam (0-23), hari-dalam-bulan (1-31), bulan (1-12), hari-dalam-pekan (0-7, di mana 0 dan 7 keduanya mewakili Minggu). Bintang (*) dalam bidang berarti "setiap nilai yang valid". Ekspresi 30 8 * * 1-5 berjalan pada 08:30 Senin hingga Jumat. Rentang menggunakan tanda hubung: 1-5 mencakup nilai 1, 2, 3, 4, 5. Daftar menggunakan koma: 1,15 berarti tanggal 1 dan 15. Langkah menggunakan garis miring: */15 dalam bidang menit berarti setiap 15 menit (0, 15, 30, 45). Kombinator ini dapat muncul bersama: 0-30/10 berarti 0, 10, 20, 30. Satu hal yang tidak dimiliki cron adalah bidang zona waktu. Daemon membaca jam mesin yang dijalankannya, yang diatur ke zona waktu lokal server. Jika server berjalan UTC tetapi seorang pengembang mengharapkan waktu lokal, jadwal akan ditembakkan pada jam yang salah. Aturan praktisnya adalah memperlakukan jadwal cron sebagai ekspresi waktu-lokal-server dan mendokumentasikan zona waktu server di samping baris cron.
Menggunakan timestamp-converter secara lokal
timestamp-converter di Sunasty mengonversi dalam kedua arah: epoch ke tanggal manusiawi dan tanggal manusiawi kembali ke epoch. Anda dapat memasukkan nilai presisi-detik atau nilai presisi-milidetik; alat mendeteksi satuannya dari besaran. Alat ini menampilkan hasilnya dalam UTC dan dalam zona waktu lokal perangkat Anda sendiri secara berdampingan, beserta nilai detik dan milidetik mentah yang siap disalin. Tombol Now mengisi timestamp saat ini dengan satu klik, yang menjadi cara cepat untuk memeriksa waktu Unix saat ini tanpa membuka terminal. Tidak ada pemilih zona waktu terpisah: kolom lokal selalu mencerminkan zona waktu apa pun yang sedang disetel di browser Anda. Semua ini berjalan di browser. Nilai yang Anda tempel ke dalam bidang dibaca oleh JavaScript sisi klien dan tidak pernah meninggalkan perangkat.
Alat dalam artikel ini
- Konverter TimestampKonversi timestamp epoch Unix ke tanggal yang dapat dibaca manusia (UTC + lokal) dan sebaliknya. Mendeteksi otomatis detik vs milidetik.
- Selisih tanggalHitung hari, minggu, bulan, dan tahun antara dua tanggal, sepenuhnya di browser Anda, tidak ada yang diunggah.
- Parser ekspresi cronUrai ekspresi cron dan pratinjau waktu pelaksanaan berikutnya. Privat, di browser.
Pertanyaan yang sering diajukan
Mengapa JavaScript menggunakan milidetik daripada detik?
Objek Date JavaScript dirancang untuk bekerja dengan presisi sub-detik dari awal, dan milidetik memberikan resolusi seribu kali lebih baik dari detik tanpa memerlukan titik desimal. Tarik-ulurnya adalah nilainya lebih besar, itulah mengapa Date.now() menghasilkan angka 13 digit sementara sebagian besar timestamp sisi server adalah 10 digit.
Apakah setiap server yang menjalankan cron harus berada di UTC?
Tidak, tetapi menjalankan server pada UTC adalah praktik umum tepatnya karena menghilangkan ambiguitas. Ketika server berada di UTC, ekspresi cron seperti 0 2 * * * berarti 02:00 UTC dan waktu tersebut stabil sepanjang tahun. Pada server di zona yang mengamati daylight saving, pekerjaan yang sama dinyalakan pada waktu UTC yang berbeda di musim panas dan musim dingin, dan mungkin dinyalakan dua kali atau dilewati sekali pada batas perubahan jam.
Apa tipe penyimpanan yang aman untuk timestamp setelah 2038?
Bilangan bulat bertanda 64-bit menyimpan timestamp presisi-detik hingga tahun 292277026596, yang jauh melampaui kekhawatiran praktis apa pun. Sebagian besar basis data saat ini menyimpan timestamp sebagai nilai 64-bit secara default. Jika Anda bekerja dengan skema lama atau format file biner yang menggunakan bidang 32-bit, migrasi ke penyimpanan 64-bit sebelum batas 2038 adalah perbaikan yang tepat.