Bahasa Indonesia

Alat pengembang · Konverter stempel waktu Unix

Bug off-by-1000: ketika tanggal menunjukkan 1970 Januari atau tahun 56000

· Mengapa itu penting

stempel waktu melakukan debug alur kerja pengembang

Skala stempel waktu terbagi menuju 1970 dan masa depan yang jauh
Ilustrasi vektor ToolAcre asli

Melewati detik yang diperkirakan milidetik (atau sebaliknya) adalah bug stempel waktu paling umum yang pernah ada. Postingan ini menunjukkan tampilannya di setiap arah, di mana ia bersembunyi di antara bahasa, dan cara menangkapnya dalam hitungan detik.

Setiap pengguna bergabung pada 1 Januari 1970 — layar yang menunjukkan bug, dan backend yang benar-benar tepat

Halaman profil yang menampilkan setiap akun mendekati 1970 Januari adalah gejala skala yang kuat. Backend mungkin telah mengembalikan epoch detik yang benar sementara kode frontend meneruskannya langsung ke konstruktor Tanggal yang menafsirkan milidetik. Hitungan hari ini kemudian menyusut seribu kali lipat pada sumbu kalender.

Jangan menambal tampilan dengan menambahkan tahun tetap atau mengganti tanggal. Tangkap bidang mentah, kontrak API-nya, dan panggilan konstruktor yang tepat. ToolAcre memungkinkan Anda memaksa kedua unit, sehingga satu nilai dapat diuji tanpa mengubah data produksi. Pembacaan yang cocok dengan peristiwa lain yang diketahui mengidentifikasi kemungkinan kesalahan batas.

Kedua gejala tersebut — detik dimasukkan ke dalam milidetik API pendaratan di bulan Januari 1970, dan milidetik dimasukkan ke dalam detik API mendarat puluhan ribu tahun

Detik diartikan sebagai milidetik mendekati zaman karena satu miliar milidetik hanyalah sebagian kecil dari satu abad. Kesalahan sebaliknya memperluas nilai triliun milidetik menjadi satu triliun detik, seringkali di luar rentang aplikasi biasa. Kedua kegagalan tersebut mempertahankan angka tersebut sambil mengubah skalanya.

Artikel sepuluh lawan tiga belas digit yang diterbitkan sudah menjelaskan heuristik visual kontemporer dan batasannya. Artikel ini berfokus pada diagnosis dan pencegahan: pemilihan unit secara eksplisit, bukti peristiwa independen, dan satu konversi pada antarmuka di mana representasi produsen memenuhi kontrak konsumen.

Karena kedua cabang bersifat deterministik, gejala dapat direproduksi dengan satu perlengkapan. Hal ini membuat ketidakcocokan unit lebih mudah dibuktikan daripada penyimpangan jam yang terputus-putus atau perilaku pemformatan lokal.

Batasannya biasanya adalah — JavaScript dan Java dalam milidetik, alat Unix, Python, dan sebagian besar database dalam hitungan detik, dan muatan JSON di antaranya

Repositori ini membuktikan bahwa JavaScript Tanggal menghabiskan milidetik dan ToolAcre mengalikan detik sebelum membuatnya. Itu tidak menetapkan default setiap Java, Python, shell atau database API yang disebutkan dalam buku kerja. Kontrak tersebut harus diperiksa di mana kontrak tersebut digunakan.

Nomor JSON tidak membawa metadata unit. Memberi nama pada bidang `created_at` mentransfer ambiguitas di seluruh layanan; menamakannya `created_at_s` atau mendokumentasikan string ISO membuat kontrak dapat ditinjau. Adaptor penerima harus mengonversi satu kali menjadi representasi internalnya daripada menyebarkan perkalian ke seluruh tampilan.

Tulis konversi di samping definisi batas, bukan di dalam tampilan bantuan yang dapat digunakan kembali. Adaptor mengetahui kontrak produsen; pemformat generik harus menerima instan yang sudah dinormalisasi.

Batas unit bersifat spesifik API; repositori ini membuktikan JavaScript Tanggal menggunakan milidetik

Perlengkapan yang lemah seperti `0` tidak dapat mendeteksi bug karena nol detik dan nol milidetik keduanya menyebutkan zaman. Nilai kecil yang dibuat-buat juga bisa terlihat seperti tanggal 1970 yang masuk akal. Tiruan yang mengembalikan skala yang sama dengan yang diharapkan oleh konsumennya tidak pernah menunjukkan ketidakcocokan integrasi yang nyata.

Pilih instan yang diketahui bukan nol dan buat kedua penafsiran tersebut terlihat sangat berbeda. Tegaskan hasil kanonik ISO pada batas, bukan hanya keberadaan objek Date. Sertakan case milidetik dan case detik; Pengujian ToolAcre sendiri membandingkan 1,000,000 pada setiap unit karena alasan ini.

Bug unit bertahan setiap kali pengujian gagal membedakan kedua skala

Pertimbangkan `created_at: 1738578000`. Dipaksa dalam hitungan detik, menjadi `2025-02-03T10:20:00.000Z`; dipaksakan dalam milidetik, menjadi `1970-01-21T02:56:18.000Z`. Catatan penerapan yang diketahui telah dibuat pada bulan Februari 2025 menyelesaikan ambiguitas tanpa hanya mengandalkan jumlah digit.

Simpan JSON mentah di samping peristiwa yang diketahui tersebut saat memperbaiki adaptor. Jika bidangnya adalah `1738578000000`, interpretasi milidetik akan mengidentifikasi momen yang sama. Kedua nilai tersebut tidak boleh diterima secara bergantian dalam satu skema, meskipun konverter dapat menunjukkan kesetaraannya setelah menerapkan skala yang benar.

Tanggal penerapan yang diketahui adalah bukti independen. Tanpa hal ini, pemilihan keluaran yang lebih masuk akal hanya akan mencerminkan ekspektasi penyidik ​​dan bukannya menentukan apa yang diinginkan produsen.

Contoh praktis: uji nilai create_at di bawah kedua unit eksplisit

Perbaikan yang tahan lama dimulai dari batas: mengurai unit sumber yang terdokumentasi, mengonversi tepat satu kali, dan mengekspos nilai internal yang diketik atau diberi nama dengan jelas. Deskripsi skema, contoh, dan klien yang dihasilkan harus mempertahankan format sufiks atau tanggal-waktu. Peninjau kemudian dapat melihat perkalian tambahan sebelum runtime.

Tambahkan perlengkapan regresi dengan skala nyata dan ekspektasi ISO yang tetap. Hindari deteksi otomatis dalam kode aplikasi ketika produsen memiliki kontrak; heuristik adalah untuk menyelidiki data warisan yang tidak pasti. ToolAcre memberi label pada pilihan yang terdeteksi dengan tepat sehingga tebakannya tidak dapat menyamar sebagai metadata yang terjamin.

Hal yang tidak tercakup dalam hal ini adalah kesalahan zona waktu, yang menggeser tanggal berdasarkan jam, bukan berdasarkan dekade

Kesalahan zona waktu biasanya menggeser tampilan berdasarkan jam dan mungkin melintasi satu hari kalender. Kesalahan faktor-1,000 terjadi selama beberapa dekade atau ribuan tahun. Mencampur diagnosis mendorong penyesuaian offset di sekitar nilai yang skalanya sudah salah. Verifikasi unit sebelum memeriksa format lokal.

Demikian pula, asal zaman yang salah bisa tetap tidak masuk akal baik dalam hitungan detik maupun milidetik. Jika tidak ada interpretasi yang cocok dengan peristiwa yang diketahui, berhentilah beralih dan selidiki produsernya. Seorang konverter mempersempit hipotesis; itu tidak membuktikan bahwa setiap bilangan bulat besar adalah waktu Unix.

Jika tahunnya masuk akal tetapi jamnya selalu berubah, maka selidiki presentasi zona. Memisahkan skala gejala ini akan memperpendek jalur dari tangkapan layar ke akar permasalahan.

Kesimpulan: satuan yang salah berarti abad yang salah — dan bagaimana unit yang dinyatakan pada konverter stempel waktu Unix memungkinkan Anda menguji kedua pembacaan dalam sekejap

Unit yang salah bukanlah metadata kosmetik—itu berubah secara instan. Perlakukan layar 1970 yang berat dan jarak tahun yang sangat jauh sebagai sinyal untuk memeriksa lapisan produsen-konsumen. Nilai, kontrak unit, dan peristiwa yang diketahui merupakan bukti tiga bagian yang lebih kuat daripada tanggal yang tampaknya masuk akal.

Gunakan konverter untuk membandingkan pembacaan eksplisit, lalu enkode skala yang dipilih dalam nama, jenis, dan pengujian. Tujuannya bukan untuk mengajarkan perangkat lunak menebak dengan lebih cerdik. Hal ini untuk menghilangkan dugaan dari jalur yang menciptakan tanggal bagi pengguna.

Tinjauan kode kemudian dapat menanyakan satu pertanyaan tepat di setiap batas: unit apa yang masuk, dan unit apa yang keluar? Hal ini lebih dapat diandalkan dibandingkan mengenali sejumlah digit tertentu.