Bahasa Melayu

Alat pembangun · Penukar cap masa Unix

Pepijat off-by-1000: apabila tarikh menunjukkan Januari 1970 atau tahun 56000

· Mengapa ia penting

cap masa penyahpepijatan aliran kerja pembangun

Skala cap masa membelah ke arah 1970 dan masa depan yang jauh
Ilustrasi vektor ToolAcre asal

Melewati saat di mana milisaat dijangka (atau sebaliknya) ialah pepijat cap masa yang paling biasa ada. Siaran ini menunjukkan penampilannya dalam setiap arah, tempat ia bersembunyi di antara bahasa dan cara menangkapnya dalam beberapa saat.

Setiap pengguna menyertai 1 Januari 1970 — skrin yang menghilangkan pepijat dan bahagian belakang yang betul-betul betul

Halaman profil yang menunjukkan setiap akaun berhampiran Januari 1970 ialah simptom skala yang kuat. Bahagian belakang mungkin telah mengembalikan saat zaman yang betul manakala kod bahagian hadapan menghantarnya terus kepada pembina Tarikh yang mentafsir milisaat. Kiraan masa kini kemudiannya mengecut dengan faktor seribu pada paksi kalendar.

Jangan tampal paparan dengan menambah tahun tetap atau menggantikan tarikh. Tangkap medan mentah, kontrak API dan panggilan pembina yang tepat. ToolAcre membolehkan anda memaksa kedua-dua unit, jadi satu nilai boleh diuji tanpa mengubah data pengeluaran. Bacaan yang sepadan dengan peristiwa lain yang diketahui mengenal pasti ralat sempadan yang mungkin berlaku.

Kedua-dua simptom itu — saat dimasukkan ke milisaat API mendarat pada bulan Januari 1970 dan milisaat disuapkan kepada satu saat API mendarat selama berpuluh-puluh ribu tahun

Detik ditafsirkan sebagai milisaat mendarat dekat dengan zaman kerana satu bilion milisaat hanyalah sebahagian kecil daripada satu abad. Kesilapan terbalik mengembangkan nilai trilion milisaat menjadi trilion saat, selalunya di luar julat aplikasi biasa. Kedua-dua kegagalan mengekalkan digit semasa menukar skalanya.

Artikel sepuluh lawan tiga belas angka yang diterbitkan sudah menjelaskan heuristik visual kontemporari dan hadnya. Artikel ini sebaliknya memfokuskan pada diagnosis dan pencegahan: pemilihan unit yang jelas, bukti peristiwa bebas dan satu penukaran pada antara muka yang mana perwakilan pengeluar memenuhi kontrak pengguna.

Kerana kedua-dua cawangan adalah deterministik, gejala boleh dihasilkan semula dengan satu lekapan. Itu menjadikan ketidakpadanan unit lebih mudah untuk dibuktikan daripada hanyut jam terputus-putus atau tingkah laku pemformatan setempat.

Di mana sempadan biasanya adalah — JavaScript dan Java dalam milisaat, alat Unix, Python dan kebanyakan pangkalan data dalam beberapa saat, dan muatan JSON di antara mereka

Repositori ini membuktikan bahawa JavaScript Tarikh menggunakan milisaat dan ToolAcre mendarab saat sebelum membina satu. Ia tidak menetapkan lalai setiap Java, Python, shell atau pangkalan data API dinamakan dalam buku kerja. Kontrak tersebut mesti diperiksa di mana ia digunakan.

Nombor JSON tidak membawa metadata unit. Menamakan medan `created_at` memindahkan kekaburan merentas perkhidmatan; menamakannya `created_at_s` atau mendokumentasikan rentetan ISO menjadikan kontrak itu boleh disemak. Penyesuai penerima hendaklah menukar sekali ke dalam perwakilan dalamannya dan bukannya menyerakkan pendaraban merentas paparan.

Tulis penukaran di sebelah definisi sempadan, bukan di dalam pembantu paparan boleh guna semula. Penyesuai mengetahui kontrak pengeluar; pemformat generik harus menerima segera yang telah dinormalisasi.

Sempadan unit adalah API-khusus; repositori ini membuktikan JavaScript Tarikh menggunakan milisaat

Lekapan yang lemah seperti `0` tidak dapat mengesan pepijat kerana sifar saat dan sifar milisaat kedua-duanya menamakan zaman. Nilai rekaan kecil juga boleh kelihatan seperti tarikh 1970 yang munasabah. Olok-olok yang mengembalikan skala yang sama yang dijangkakan oleh penggunanya tidak pernah menggunakan ketidakpadanan integrasi sebenar.

Pilih segera bukan sifar yang diketahui dan jadikan kedua-dua tafsiran itu berbeza dengan ketara. Tegaskan hasil ISO kanonik di sempadan, bukan sekadar objek Tarikh wujud. Sertakan sarung milisaat dan sarung detik; Ujian ToolAcre sendiri membandingkan 1,000,000 di bawah setiap unit atas sebab ini.

Pepijat unit bertahan apabila ujian gagal membezakan kedua-dua skala

Pertimbangkan `created_at: 1738578000`. Dipaksa sebagai saat, ia menjadi `2025-02-03T10:20:00.000Z`; dipaksa sebagai milisaat, ia menjadi `1970-01-21T02:56:18.000Z`. Rekod penempatan yang diketahui telah dibuat pada Februari 2025 menyelesaikan kekaburan tanpa bergantung semata-mata pada kiraan digit.

Simpan JSON mentah di sebelah peristiwa yang diketahui semasa membetulkan penyesuai. Jika medan itu `1738578000000`, tafsiran milisaat akan mengenal pasti segera yang sama. Kedua-dua nilai tidak boleh diterima secara bergantian dalam satu skema, walaupun penukar boleh menunjukkan kesetaraan mereka selepas menggunakan skala yang betul.

Tarikh penggunaan yang diketahui adalah bukti bebas. Tanpa itu, memilih output yang lebih munasabah boleh mengekod jangkaan penyiasat dan bukannya menentukan perkara yang dimaksudkan oleh pengeluar.

Contoh yang berjaya: uji nilai create_at di bawah kedua-dua unit eksplisit

Pembaikan tahan lama bermula di sempadan: hurai unit sumber yang didokumenkan, tukar sekali dan dedahkan nilai dalaman yang ditaip atau dinamakan dengan jelas. Perihalan skema, contoh dan klien yang dijana harus mengekalkan format akhiran atau tarikh-masa. Penyemak kemudian boleh melihat pendaraban tambahan sebelum masa jalan.

Tambahkan lekapan regresi dengan skala sebenar dan jangkaan ISO tetap. Elakkan pengesanan automatik dalam kod aplikasi apabila pengeluar mempunyai kontrak; heuristik adalah untuk menyiasat data warisan yang tidak pasti. ToolAcre melabelkan pilihannya yang dikesan dengan tepat supaya tekaan tidak boleh menyamar sebagai metadata terjamin.

Perkara yang tidak dilindungi ini — kesilapan zon waktu, yang mengubah tarikh mengikut jam dan bukannya berdekad

Ralat zon waktu lazimnya mengalihkan paparan mengikut jam dan mungkin merentasi satu hari kalendar. Ralat faktor-1,000 beralih selama beberapa dekad atau beribu tahun. Mencampurkan diagnosis menggalakkan pelarasan mengimbangi sekitar nilai yang skalanya sudah salah. Sahkan unit sebelum memeriksa pemformatan setempat.

Begitu juga, asal zaman yang salah boleh kekal mengarut di bawah kedua-dua saat dan milisaat. Jika tiada tafsiran sepadan dengan mana-mana peristiwa yang diketahui, hentikan togol dan siasat penerbit. Penukar menyempitkan hipotesis; ia tidak membuktikan bahawa setiap integer besar ialah masa Unix.

Jika tahun itu munasabah tetapi jamnya dialihkan secara konsisten, maka siasat pembentangan zon. Mengekalkan skala gejala ini berasingan memendekkan laluan daripada tangkapan skrin kepada punca punca.

Bawa pulang: unit yang salah ialah abad yang salah — dan cara unit yang dinyatakan oleh penukar cap waktu Unix membolehkan anda menguji kedua-dua bacaan dalam seketika

Unit yang salah bukanlah metadata kosmetik—ia berubah seketika. Anggap 1970-skrin berat dan tahun-tahun jauh yang tidak masuk akal sebagai isyarat untuk memeriksa jahitan pengeluar-pengguna. Nilai, kontrak unit dan peristiwa yang diketahui membentuk bukti tiga bahagian yang lebih kuat daripada tarikh yang nampaknya munasabah.

Gunakan penukar untuk membandingkan bacaan eksplisit, kemudian mengekod skala yang dipilih dalam nama, jenis dan ujian. Matlamatnya bukan untuk mengajar perisian meneka dengan lebih bijak. Ia adalah untuk mengalih keluar tekaan daripada laluan yang mencipta tarikh untuk pengguna.

Semakan kod kemudiannya boleh menanyakan satu soalan tepat pada setiap sempadan: unit apa yang masuk, dan unit apa yang keluar? Itu lebih dipercayai daripada mengenali bilangan digit tertentu.