Alat pembangun · Penukar cap masa Unix
Cap masa Unix negatif: cara tarikh sebelum 1970 diwakili
· Bagaimana ia berfungsi
cap masa masa unix format data
Masa Unix dikira ke hadapan daripada 1970, tetapi masa dikira ke belakang juga. Siaran ini menerangkan maksud zaman negatif, cara −1 menjadi detik terakhir 1969 dan sistem yang menganggap nilai positif pecah.
Tarikh lahir dengan tanda tolak — pengguna yang dilahirkan di 1965 disimpan sebagai integer negatif dan kod yang menganggapnya sebagai ralat
Rekod untuk seseorang yang lahir sebelum 1970 boleh mengandungi cap masa Unix negatif secara sah. Menolak setiap tanda tolak di hadapan menukar pilihan perwakilan kepada pepijat kehilangan data. Penghurai ToolAcre menerima tanda pilihan dan `fromEpoch` menandakan nilai milisaat yang ditafsirkan di bawah sifar sebagai `beforeEpoch` dan bukannya menganggapnya sebagai tidak sah.
Paparan kemudiannya menambah nota yang menjelaskan bahawa segera mendahului zaman Unix. Ini lebih kuat daripada memaparkan tarikh secara senyap kerana ia memastikan tanda luar biasa kelihatan kepada pengulas. Jika skema huluan melarang negatif, kegagalan adalah milik skema atau penghijrahan itu, bukan aritmetik yang memetakan dikira pada kedua-dua belah sifar.
Integer yang ditandatangani dan zaman — mengapa time_t ditandatangani, dan apa yang −1 dan −86400 sepadan dengan
Sifar ialah 1970-01-01T00:00:00.000Z. Ujian repositori membuktikan bahawa −1 saat ialah segera sebelum itu, `1969-12-31T23:59:59.000Z`. Begitu juga, −86,400 saat ialah satu tetap POSIX hari sebelum sifar. Aritmetik yang ditandatangani menjadikan paksi berterusan dan bukannya memerlukan zaman kedua untuk rekod lama.
Garis besar mengaitkan storan bertandatangan kepada `time_t`, tetapi kod ini tidak menetapkan sejarah reka bentuk atau jenis yang digunakan oleh setiap platform. Buktinya yang lebih sempit sudah memadai: JavaScript nombor boleh menjadi negatif, pengesanan menggunakan magnitud mutlak dan Tarikh boleh memformatkan hasilnya. Terangkan jenis medan pengeluaran yang diisytiharkan secara berasingan daripada input yang diterima penukar.
Aritmetik zaman yang ditandatangani sekitar sifar, tanpa menuntut mengapa setiap kali_t memilih jenisnya
Nilai negatif mengekalkan perbezaan unit yang sama seperti nilai positif. `−1000` saat mata 1,000 saat sebelum zaman, manakala `−1000` milisaat mata sahaja satu saat sebelum itu. Pengesanan automatik menganggap kedua-duanya sebagai saat kerana magnitudnya adalah di bawah 10¹¹, jadi kiraan milisaat pra-zaman yang singkat memerlukan pemilihan milisaat yang jelas.
Ini adalah kegagalan konkrit cerita rakyat bilangan digit. Pembangun yang melihat tanda tolak dan empat digit tidak boleh membuat kesimpulan unit daripada rupa. Gunakan kontrak sumber, pilih pemilih dan periksa nota unit. Peraturan magnitud ToolAcre ialah lalai untuk data biasa, bukan penggantian untuk metadata pada nilai sejarah yang hampir dengan 1970.
Apabila nilai negatif gagal — sistem yang menggunakan −1 sebagai sentinel, storan tidak ditandatangani, pemilih tarikh yang mengapit dan bahasa yang menolaknya
Di luar penukar, `−1` kadangkala dikhaskan sebagai sentinel yang tiada nilai dan lajur yang tidak ditandatangani tidak boleh mengekalkan sebarang segera negatif. Itu adalah kemungkinan reka bentuk biasa, tetapi repositori tidak dapat mengesahkan bagaimana pangkalan data, pemilih tarikh atau bahasa tertentu bertindak. Uji sempadan sebenar sebelum memindahkan tarikh arkib melaluinya.
Siasatan berguna mengandungi tiga nilai: batal atau penanda hilang yang didokumenkan, −1 dan tarikh yang jelas lebih lama. Jika −1 hilang sementara nilai yang lebih lama bertahan, pengendalian sentinel terlibat; jika semua negatif gagal, periksa jenis dan pengesahan. Jangan "betulkan" gejala dengan menambah 1970 tahun atau mengambil nilai mutlak, kerana kedua-duanya mencipta detik yang berbeza.
Contoh yang berjaya: menukar −14182940 — aritmetik kepada tarikh 1969 Julai di UTC dan di zon tempatan di barat Greenwich
Selama −14,182,940 saat, mulakan pada zaman dan bergerak ke belakang 164 selesaikan 86,400-hari, meninggalkan 13,340 saat. Bakinya ialah 3 jam, 42 minit dan 20 saat. Bacaan UTC yang terhasil ialah `1969-07-20T20:17:40.000Z`, serta-merta dipilih di sini khusus untuk artikel ini.
Bacaan tempatan di sebelah barat UTC mungkin menunjukkan jam dinding lebih awal atau tarikh lain, tetapi keputusan tepatnya bergantung pada zon pelayar dan peraturan Antarabangsa. Bacanya dari panel dan bukannya menerbitkan jawapan universal. Pengesahan tetap ialah baris ISO; baris setempat ialah anotasi persekitaran pada kiraan negatif yang sama.
Contoh yang berjaya: menukar −14,182,940 dengan aritmetik UTC yang boleh disahkan
ToolAcre menyemak nilai tafsirannya terhadap ±8.64×10¹⁵ milisaat, julat Tarikh yang dinyatakan dalam sumber. Ia juga membuktikan penukaran −2,208,988,800 saat kepada `1900-01-01T00:00:00.000Z`. Fakta tersebut menunjukkan bahawa laluan itu sampai jauh sebelum 1970 tanpa membayangkan bahawa setiap sistem storan boleh membawa julat yang sama.
Medan 32-bit yang ditandatangani mempunyai selang matematik yang lebih sempit daripada JavaScript Tarikh, tetapi penukar tidak memeriksa lebar medan apabila anda menampal nombor. Kekalkan jenis sumber dalam audit. Penukaran pelayar yang berjaya menunjukkan kebolehwakilan di sini, bukan perjalanan pergi balik yang selamat melalui perisian tegar, lajur SQL atau protokol binari di tempat lain.
Julat Tarikh penukar diketahui; had 32-bit luaran bergantung pada jenis storannya
Mengubah kiraan menjadi JavaScript Tarikh tidak membina semula kalendar sivil yang sebenarnya dicetak di setiap lokasi berabad-abad yang lalu. Pelaksanaan menggunakan model tarikh platform dan mengembalikan perwakilan ISO; ia tidak mengandungi pemilih kalendar sejarah, arkib setempat atau sumber dokumentari untuk pembaharuan kalendar. Tuntutan tersebut sengaja tidak hadir.
Untuk rekod perisian moden, perwakilan mesin proleptik mungkin masih sama seperti kontrak yang anda perlukan. Untuk salasilah, sejarah undang-undang atau transkripsi arkib, kekalkan tarikh bertulis asal dan konteks kalendarnya di samping mana-mana zaman terbitan. Nombor boleh diisih yang mudah tidak seharusnya memadamkan ketidakpastian yang tidak dapat diselesaikan oleh penukaran.
Tuntutan sejarah kalendar adalah di luar bukti penukar ini
Negatif ialah arah pada paksi zaman, bukan kategori ralat. ToolAcre menghuraikannya, menggunakan peraturan saat atau milisaat yang sama mengikut magnitud dan membenderakan hasilnya seperti sebelum zaman. Tingkah laku itu membolehkan pengulas membezakan segera lama yang sah daripada sentinel atau kegagalan storan yang tidak ditandatangani di tempat lain.
Apabila mengaudit data pra-1970, nyatakan unit, jenis sumber dan konvensyen nilai hilang sebelum mentafsir tanda. Kemudian bandingkan hasil ISO dengan rekod yang diketahui. Tanda sahaja adalah aritmetik yang bermakna; skema sekeliling menentukan sama ada pengeluar bertujuan aritmetik itu atau menggunakan nombor yang sama sebagai nilai kawalan.