Ini sama sekali bukan berita, tapi cukup sering muncul sehingga menurut saya harus ada penjelasan singkat mengenai masalahnya. Orang-orang, termasuk saya sendiri, mengatakan bahwa waktu POSIX, juga dikenal sebagai waktu Unix, adalah waktu nomor dari detik sejak itu Unix masayaitu 1970-01-01 pukul 00:00:00.
Ini tidak benar. Atau lebih tepatnya, hal itu tidak benar seperti yang dipikirkan kebanyakan orang. Misalnya, saat ini tanggal 25-12-2024 pukul 18:54:53 UTC. Waktu POSIX adalah 1735152686. Sudah 1735152715 detik sejak zaman POSIX. Angka waktu POSIX lebih rendah dua puluh sembilan detik.
Hal ini karena waktu POSIX diturunkan di IEEE 1003.1 dari Waktu Universal Terkoordinasi. Standar ini mengasumsikan bahwa setiap hari berdurasi tepat 86.400 detik. Secara khusus:
Itu waktu() fungsi mengembalikan nilai waktu masuk detik sejak Epoch.
Yang didefinisikan sebagai:
detik sejak Epoch. Nilai yang ditafsirkan sebagai jumlah detik antara waktu tertentu dan Epoch. Nama Waktu Universal Terkoordinasi (ditentukan dalam satuan detik (tm_detik), menit (tm_min), jam (tm_jam), hari sejak 1 Januari tahun tersebut (tm_yday), dan tahun kalender dikurangi 1900 (tm_tahun)) terkait dengan waktu yang direpresentasikan sebagai detik sejak Epoch sesuai dengan ekspresi di bawah ini.
Jika tahun < 1970 atau nilainya negatif maka hubungannya tidak terdefinisi. Jika tahun ≥ 1970 dan nilainya bukan negatif, maka nilai tersebut terkait dengan nama Waktu Universal Terkoordinasi menurut ekspresi:
tm_detik + tm_min * 60+ tm_jam *3600+ tm_yday *86400+(tm_tahun-70) * 31536000 + ((tm_tahun – 69) / 4) * 86400
Lamanya satu hari bukanlah 86.400 detik, bahkan berubah seiring berjalannya waktu. Untuk menjaga agar hari UTC tidak menyimpang terlalu jauh dari hari matahari, para astronom secara berkala menyatakan a lompatan kedua dalam UTC. Akibatnya, setiap beberapa tahun waktu POSIX melompat mundur, mendatangkan malapetaka mengucapkan malapetaka. Suatu hari nanti mungkin akan melompat ke depan.
Lampiran B IEEE 1003 berisi diskusi menarik tentang detik kabisat:
Konsep detik kabisat ditambahkan untuk presisi; pada saat standar ini diterbitkan, 14 detik kabisat telah ditambahkan sejak 1 Januari 1970. 14 detik ini diabaikan untuk memberikan metode penghitungan perbedaan waktu yang mudah dan kompatibel.
Saya juga suka mengabaikan hal-hal untuk membuat hidup saya mudah. Penulis standar mengetahui bahwa “detik sejak zaman” sebenarnya bukanlah detik sejak zaman tersebut. Dan mereka mengakui hal yang sama:
Gagasan sebagian besar sistem tentang “waktu” adalah nilai yang terus meningkat, sehingga nilai ini harus meningkat bahkan selama detik kabisat. Namun, sebagian besar sistem tidak hanya tidak mencatat detik kabisat, tetapi sebagian besar sistem mungkin tidak disinkronkan dengan referensi waktu standar apa pun. Oleh karena itu, tidak tepat jika waktu direpresentasikan sebagai detik karena Epoch secara tepat mewakili jumlah detik antara waktu yang direferensikan dan Epoch.
Cukup dengan mensyaratkan bahwa aplikasi diperbolehkan untuk memperlakukan waktu ini seolah-olah mewakili jumlah detik antara waktu yang direferensikan dan Epoch. Merupakan tanggung jawab vendor sistem, dan administrator sistem, untuk memastikan bahwa nilai ini mewakili jumlah detik antara waktu yang direferensikan dan Epoch sedekat yang diperlukan untuk aplikasi yang dijalankan pada sistem tersebut….
Saya membayangkan ada perdebatan mengenai hal ini. Lampiran tersebut menyatakan bahwa vendor dan administrator harus menyelaraskan waktu “sedekat yang diperlukan”, dan bahwa “nilai ini harus meningkat bahkan pada detik kabisat”. Yang terakhir ini bisa dicapai, tapi yang pertama bisa dibilang mustahil: standarnya mengharuskan jam POSIX dimatikan dua puluh sembilan detik.
Interpretasi detik yang konsisten sejak Epoch dapat menjadi sangat penting untuk jenis aplikasi terdistribusi tertentu yang mengandalkan stempel waktu tersebut untuk menyinkronkan peristiwa. Jumlah detik kabisat dalam suatu standar waktu tidak dapat diprediksi. Jumlah detik kabisat sejak Epoch kemungkinan besar akan bertambah. Standar ini lebih memperhatikan sinkronisasi waktu antara aplikasi-aplikasi dengan durasi yang sangat pendek dan Kelompok Kerja memperkirakan kekhawatiran ini akan menjadi lebih penting di masa depan.
Dalam arti tertentu, yang terjadi justru sebaliknya. Sinkronisasi waktu adalah selalu mati, sehingga sistem umumnya berfungsi (walaupun salah) ketika waktu sedikit menyimpang. Namun detik kabisat jarang terjadi, dan linearitas yang ditimbulkan oleh frasa “detik sejak zaman” begitu tertanam dalam intuisi kita, sehingga perangkat lunak dapat menimbulkan bug yang serius dan tidak disadari. Hingga beberapa tahun kemudian, salah satu detik kabisat kecil itu menghancurkan sebagian besar internet.
Jika Anda hanya perlu menghitung durasi antara dua peristiwa di satu komputer, gunakan JAM_MONOTONIC. Jika Anda tidak perlu menukar stempel waktu dengan sistem lain yang menggunakan waktu POSIX, gunakan TAI, GPS, atau mungkin LORAN. Jika Anda memerlukan penyelarasan kasar dengan sistem stempel waktu POSIX lainnya, noda detik kabisat dalam jangka waktu yang lebih lama. Perpustakaan seperti tai qntm dapat mengkonversi bolak-balik antara POSIX dan TAI.
Ada upaya berkelanjutan untuk melakukannya akhir detik kabisatsemoga pada tahun 2035. Dibutuhkan upaya tambahan untuk membuat tabel konversi menjadi segala sesuatu yang bergantung pada asumsi “86.400 detik per hari”, namun juga akan mempermudah untuk mengajukan pertanyaan seperti “berapa detik antara dua waktu ini”. Setidaknya untuk saat-saat setelah tahun 2035!