Alat pengembang · Konverter stempel waktu Unix
Masalah tahun 2038: apa yang terjadi ketika 32-bit time_t meluap
· Latar belakang
stempel waktu waktu unix melakukan debug
Pada 19 Januari 2038 di 03:14:07 UTC penghitung detik bertanda tangan 32-bit berakhir dengan 1901. Postingan ini menjelaskan aritmatika, di mana waktu 32-bit masih bersembunyi, dan cara mengenali sistem yang akan terpengaruh.
Tanggal yang lebih dekat daripada yang terlihat — hipotek, sertifikat, dan firmware sudah menghitung tanggal setelah 2038
Batas bertanggal 2038 memengaruhi kode setiap kali ia menghitung batas waktu kedaluwarsa, jadwal, atau retensi di luar titik tersebut. Oleh karena itu, kegagalan dapat muncul beberapa tahun lebih awal dari tanggal jam. Repositori ini tidak mendokumentasikan produk hipotek, sertifikat atau firmware, sehingga contoh-contoh tersebut tidak disajikan sebagai kasus yang diamati.
Pertanyaan audit praktisnya adalah apakah ada batas yang menyimpan detik Unix dalam bilangan bulat 32-bit yang ditandatangani. Browser modern yang berhasil memformat tanggal yang akan datang tidak menjelaskan apa pun tentang bidang yang lebih sempit di bagian hilir. Lacak serialisasi dan persistensi, bukan hanya antarmuka pengguna.
Cari perhitungan masa depan dalam pengujian hari ini daripada menunggu jam produksi. Perlengkapan batas yang tetap mengubah masalah kalender yang jauh menjadi pemeriksaan yang segera dan dapat diulang.
Penghitungan di masa mendatang dapat menampilkan batas 32-bit sebelum 2038, namun industri yang disebutkan tidak dibuktikan di sini
Maksimal bilangan bulat bertanda 32-bit adalah 2³¹−1, atau 2,147,483,647. Pengujian menetapkan beberapa detik setelah periode tersebut sebagai `2038-01-19T03:14:07.000Z`. Satu detik matematis lagi seharusnya menjadi 03:14:08, dan ToolAcre menampilkannya karena JavaScript Nomor dan Tanggal dapat membawa nilai tersebut.
Membungkus ke nilai negatif memerlukan operasi 32-bit eksternal yang ditandatangani; `fromEpoch` tidak melakukan hal tersebut. Hasil 1901 bulan Desember yang sering dikutip dapat disimpulkan sebagai dua hal yang saling melengkapi, namun mengklaim bahwa setiap sistem yang terkena dampak melakukan wrap, bukannya penolakan, jenuh, atau korup, adalah hal yang tidak masuk akal. Uji batas sebenarnya.
Jika cetakan eksternal membungkus aritmatika komplemen dua, periksa bit tersimpan yang dihasilkan dan nilai negatif yang didekodekan. Jangan menyimpulkan bungkusan hanya dari tanggal sejarah yang tidak terduga.
Instan atas yang tepat telah diverifikasi; perilaku bungkus bergantung pada operasi bilangan bulat eksternal
Cari skema, definisi protokol, dan tata letak biner untuk bidang bertanda 32-bit yang menampung epoch detik. Kolom SQL bernama INTEGER tidak cukup bukti di semua mesin, dan platform tertanam tidak otomatis terpengaruh. Tentukan lebar, penandatanganan, satuan, dan kode konversi untuk setiap jalur.
Sertakan file dan catatan cache dalam audit. Tipe memori yang diperluas masih dapat menulis format lama yang sempit, sedangkan database yang luas dapat menerima nilai klien yang terpotong. Buat perlengkapan secara maksimal dan seterusnya, lalu periksa byte atau nilai yang dipertahankan, bukan hanya memeriksa apakah suatu fungsi berhasil.
Temukan bidang epoch 32-bit yang ditandatangani dengan memeriksa skema dan format sebenarnya
Perbaikan konseptual adalah representasi yang rentangnya mencakup tanggal yang diperlukan, biasanya hitungan bertanda tangan yang lebih luas atau tipe temporal yang sesuai. Narasi kernel, libc, dan migrasi format buku kerja berada di luar file sumber ini. Setiap sistem memiliki kompatibilitas dan pekerjaan penerapannya sendiri.
Perluas setiap batasan sebagai perubahan kontrak yang terkoordinasi. Memperbarui penyimpanan tanpa bidang kabel, atau perpustakaan tanpa data yang ada, meninggalkan tautan yang sempit. Tambahkan versi jika perlu dan uji pembaca lama secara eksplisit. Definisi zaman itu sendiri tidak perlu diubah; wadahnya bisa.
Perencanaan migrasi harus mencakup perilaku rollback dan versi campuran. Seorang penulis baru yang menghasilkan nilai-nilai luas dapat menghancurkan pembaca lama sebelum tanggal yang ada mencapai batas kalender.
Memperluas representasi adalah perbaikan inti; migrasi kernel dan format bersifat spesifik sistem
Ubah 2,147,483,647 sebagai detik untuk mendapatkan `2038-01-19T03:14:07.000Z`; konversikan 2,147,483,648 untuk mendapatkan `2038-01-19T03:14:08.000Z`. Langkah satu detik yang mulus membuktikan jalur ToolAcre tidak memiliki tebing 32-bit pada nilai tersebut.
Sekarang paksakan angka yang sama dengan milidetik. Nilai tersebut jatuh pada bulan Januari 1970 karena nilainya kira-kira dua puluh lima hari setelah nol. Perbandingan tersebut mencegah kesalahan unit diberi label yang salah sebagai masalah 2038. Lebar dan skala bidang adalah dimensi independen.
Perbandingan ini juga menunjukkan mengapa konverter lebih bersifat diagnostik daripada rentan: pemilihan unit secara eksplisit menentukan skala, sementara representasi browser yang lebih luas membawa kedua nilai tersebut.
Contoh praktis: konverter melewati batas karena JavaScript Tanggal tidak ditandatangani 32-bit detik
Repositori juga menguji 4,294,967,295 detik sebagai `2106-02-07T06:28:15.000Z`, jumlah maksimum 32-bit yang tidak ditandatangani. Ini tidak menguji rollover GPS minggu atau menentukan tebing milidetik 64-bit yang ditandatangani, sehingga topik yang disebutkan tersebut dihilangkan daripada digeneralisasi.
Analisis batas harus mengikuti jenis penggunaan yang tepat. Beralih dari ditandatangani ke tidak ditandatangani memperluas satu arah tetapi menghilangkan tanggal negatif dan masih menciptakan keunggulan. Representasi bertanda tangan yang lebih luas umumnya mempertahankan kedua arah, bergantung pada rentang tanggal konsumen.
Setiap tebing memerlukan derivasi tersendiri mulai dari lebar, tanda tangan, dan satuan. Mengelompokkan rollover yang tidak terkait di bawah “2038” mengaburkan bidang biner mana yang sebenarnya memerlukan perubahan.
Batas 32-bit yang tidak ditandatangani diuji; tebing bernama lainnya berada di luar bukti penyimpanan
Konverter tidak dapat mengaudit kode sumber, biner, skema database, atau perangkat yang diterapkan. Ini menunjukkan arti nomor kandidat dan menyediakan perlengkapan konkret untuk tes. Pencarian statis, pemeriksaan tipe, pengujian serialisasi, dan latihan migrasi harus menentukan apakah suatu produk aman.
Jangan tutup audit karena browser merender 2038 dengan benar. Itu hanya memverifikasi jalur browser ini. Ikuti nilai secara menyeluruh, terutama melalui pengikatan bahasa dan format lama di mana penyempitan implisit dapat terjadi.
Sertakan ketergantungan dan antarmuka vendor dalam pelacakan tersebut. Sumber aplikasi mungkin menggunakan tipe yang luas sementara perpustakaan asli atau protokol perangkat mempersempit nilai yang sama tanpa terlihat.
Kesimpulan: zamannya baik-baik saja, lebar bilangan bulat adalah masalahnya — dan bagaimana konverter stempel waktu Unix memungkinkan Anda memeriksa nilai batas apa pun dalam UTC dan waktu setempat
Masalah tahun 2038 adalah batas lebar bilangan bulat, bukan cacat dalam aritmatika zaman Unix. Konversi sukses ToolAcre di kedua sisi membuat pemisahan itu terlihat. Sistem eksternal gagal hanya jika salah satu representasinya tidak dapat melakukan penghitungan berikutnya.
Gunakan 2,147,483,647 dan 2,147,483,648 sebagai vektor uji yang berdekatan, verifikasi persistensi yang tepat, dan dokumentasikan unit dan penandatanganan. Bukti di setiap batasan lebih berharga daripada daftar umum teknologi yang dianggap rentan.
Vektor yang berdekatan harus melewati jalur serialisasi yang sebenarnya, bukan hanya penghitungan dalam memori. Di sinilah aplikasi yang melebar secara nominal dapat memperlihatkan sisa jahitan sempit.