Artikel
Cap masa Unix dan ungkapan cron dijelaskan
Cap masa Unix hanyalah integer. Ungkapan cron hanyalah lima medan. Kedua-duanya kerap muncul dalam kerja bahagian belakang, dan kedua-duanya mengelirukan orang dengan cara yang boleh diramalkan: satu kerana zon masa, yang lain kerana unit.
Apakah cap masa Unix
Cap masa Unix mengira bilangan saat yang telah berlalu sejak 1970-01-01 00:00:00 UTC, titik rujukan yang dikenali sebagai epoch Unix. Definisi itu mempunyai dua akibat penting. Pertama, kiraan adalah dalam UTC: tiada zon masa yang terbenam dalam nombor itu sendiri. 1718400000 bermaksud detik yang sama di mana-mana sahaja di Bumi tanpa mengira di mana mesin yang menyimpannya berada. Kedua, epoch ditakrifkan dalam saat, bukan dalam unit lain. Nilai seperti 1718400000 sentiasa saat sejak tengah malam 1 Januari 1970 UTC, melainkan sistem atau protokol telah membuat pilihan yang berbeza secara jelas. Cap masa bebas zon masa secara reka bentuk, yang tepat itulah sebabnya ia berguna untuk pengelogan, pangkalan data, dan komunikasi antara sistem di mana jam di kawasan berbeza mesti merujuk kepada detik yang sama tanpa kekaburan.

Saat, milisaat, dan masalah tahun 2038
Banyak runtime dan API moden menggunakan milisaat dan bukannya saat. Date.now() JavaScript mengembalikan milisaat, jadi 1718400000000 adalah detik yang sama seperti nilai ketepatan saat 1718400000. Apabila anda menerima cap masa yang tidak dikenali, magnitudnya memberitahu anda unitnya: nombor 10 digit hampir selalu saat; nombor 13 digit hampir selalu milisaat. Masalah tahun 2038 timbul daripada pilihan yang berbeza: menyimpan cap masa ketepatan saat dalam integer bertanda 32-bit. Nilai maksimum integer bertanda 32-bit ialah 2147483647, yang sepadan dengan 2038-01-19 03:14:07 UTC. Selepas saat itu, pembilang melimpah ke nombor negatif yang besar dan tarikh berundur ke 1901 pada sistem yang tidak mengendalikan sempadan itu. Pembaikan adalah menggunakan storan 64-bit. Kebanyakan sistem pengendalian dan pangkalan data semasa sudah melakukannya, tetapi sistem terbenam, peranti rangkaian, dan format fail lama yang menetapkan lebar medan beberapa dekad lalu masih berisiko.
Menukar epoch kepada tarikh manusia: langkah zon masa
Menukar nilai epoch kepada tarikh yang boleh dibaca memerlukan dua langkah: dapatkan semula komponen tarikh UTC daripada integer, kemudian gunakan offset UTC untuk mendapatkan waktu tempatan. Cap masa itu sendiri adalah UTC. Apabila anda bertanya tarikh apa yang diwakili oleh 1718325000, jawapan yang betul ialah 2024-06-14 pada pukul 00:30 dalam UTC. Di New York (UTC-4 pada musim panas), saat yang sama jatuh pada 2024-06-13 pukul 20:30 petang sebelumnya: tarikhnya berubah, bukan sekadar jamnya. Inilah langkah yang menghasilkan keputusan yang salah apabila dilangkau: pembangun mencatat cap masa mentah dalam UTC, alat pelaporan merendernya dalam waktu tempatan tanpa penukaran, dan tarikhnya kelihatan tersasar beberapa jam atau sehari penuh. Alat timestamp-converter di Sunasty mengendalikan ini secara jelas: anda memasukkan nilai epoch dan ia menunjukkan tarikh dan masa UTC di sebelah tarikh dan masa tempatan peranti anda sendiri, jadi lintasan sempadan hari seperti ini kelihatan sekali pandang. Penukaran berjalan sepenuhnya dalam pelayar dan tiada yang anda tampalkan dihantar ke mana-mana.

Sintaks cron: lima medan, julat, langkah, dan senarai
Ungkapan cron menjadualkan tugas berulang pada sistem seperti Unix. Sintaks standard mempunyai lima medan yang dipisahkan ruang: minit (0-59), jam (0-23), hari-dalam-bulan (1-31), bulan (1-12), hari-dalam-minggu (0-7, di mana 0 dan 7 mewakili Ahad). Bintang (*) dalam medan bermaksud "setiap nilai yang sah". Ungkapan 30 8 * * 1-5 berjalan pada 08:30 dari Isnin hingga Jumaat. Julat menggunakan tanda sempang: 1-5 merangkumi nilai 1, 2, 3, 4, 5. Senarai menggunakan koma: 1,15 bermaksud yang ke-1 dan ke-15. Langkah menggunakan garis miring: */15 dalam medan minit bermaksud setiap 15 minit (0, 15, 30, 45). Penggabung ini boleh muncul bersama-sama: 0-30/10 bermaksud 0, 10, 20, 30. Satu perkara yang tidak ada pada cron ialah medan zon masa. Daemon membaca jam mesin yang dijalankannya, yang ditetapkan kepada zon masa tempatan pelayan. Jika pelayan menjalankan UTC tetapi pembangun menjangkakan waktu tempatan, jadual akan berjalan pada jam jam yang salah. Peraturan praktikal ialah menganggap jadual cron sebagai ungkapan waktu-tempatan-pelayan dan mendokumentasikan zon masa pelayan bersama baris cron.
Menggunakan timestamp-converter secara tempatan
Timestamp-converter di Sunasty menukar dalam kedua-dua arah: epoch kepada tarikh manusia dan tarikh manusia kembali kepada epoch. Anda boleh memasukkan nilai ketepatan saat atau nilai ketepatan milisaat; alat itu mengesan unit daripada magnitud. Ia menunjukkan hasilnya dalam UTC dan dalam zon masa tempatan peranti anda sendiri bersebelahan, bersama nilai saat dan milisaat mentah yang sedia untuk disalin. Butang Now mengisi cap masa semasa dengan satu klik, yang merupakan cara pantas untuk menyemak waktu Unix semasa tanpa membuka terminal. Tiada pemilih zon masa berasingan: lajur tempatan sentiasa mencerminkan zon masa yang sedang ditetapkan oleh pelayar anda. Semuanya berjalan dalam pelayar. Nilai yang anda tampalkan ke dalam medan dibaca oleh JavaScript sisi klien dan tidak pernah meninggalkan peranti.
Alat dalam artikel ini
- Penukar Cap MasaTukar cap masa epok Unix kepada tarikh manusia (UTC + setempat) dan sebaliknya. Mengesan saat berbanding milisaat secara automatik.
- Beza tarikhKira hari, minggu, bulan dan tahun antara dua tarikh, sepenuhnya dalam pelayar anda, tiada muat naik.
- Penghurai ungkapan cronHurai ungkapan cron dan pratonton waktu jalan seterusnya. Peribadi, dalam pelayar.
Soalan lazim
Mengapa JavaScript menggunakan milisaat dan bukannya saat?
Objek Date JavaScript direka untuk bekerja dengan ketepatan sub-saat dari awal, dan milisaat memberikan resolusi seribu kali ganda berbanding saat tanpa memerlukan titik perpuluhan. Pertukaran gantinya ialah nilai yang lebih besar, itulah sebabnya Date.now() menghasilkan nombor 13 digit sementara kebanyakan cap masa sisi pelayan adalah 10 digit.
Adakah setiap pelayan yang menjalankan cron perlu berada pada UTC?
Tidak, tetapi menjalankan pelayan pada UTC adalah amalan biasa tepat kerana ia menghilangkan kekaburan. Apabila pelayan berada pada UTC, ungkapan cron seperti 0 2 * * * bermaksud 02:00 UTC dan masa itu stabil sepanjang tahun. Pada pelayan dalam zon yang mengamati waktu penjimatan siang hari, tugas yang sama berjalan pada detik UTC yang berbeza pada musim panas dan musim sejuk, dan ia mungkin berjalan dua kali atau melangkau sekali pada sempadan perubahan jam.
Apakah jenis storan selamat untuk cap masa selepas 2038?
Integer bertanda 64-bit menyimpan cap masa ketepatan saat hingga tahun 292277026596, yang jauh melepasi mana-mana kebimbangan praktikal. Kebanyakan pangkalan data semasa menyimpan cap masa sebagai nilai 64-bit secara lalai. Jika anda bekerja dengan skema warisan atau format fail binari yang menggunakan medan 32-bit, memindahkan kepada storan 64-bit sebelum sempadan 2038 adalah pembaikan yang betul.