Tentunya Anda yakin bahwa beberapa - jika tidak semua - pernyataan ini selalu benar dan di mana-mana:
- Selalu ada 24 jam dalam sehari.
- Seminggu selalu dimulai dan diakhiri di bulan yang sama.
- Satu minggu (atau bulan) selalu dimulai dan diakhiri di tahun yang sama.
- Waktu tidak memiliki awal dan akhir.
- Bisa ada 28, 29, 30 atau 31 hari dalam sebulan.
- Ada tahun kabisat setiap 4 tahun.
- Setiap bulan jumlah hari selalu sama dimana-mana.
- Server dan klien akan selalu memiliki waktu yang sama.
- Anda dapat dengan mudah menghitung jumlah jam dan menit mulai dari beberapa titik waktu.
- Setiap menit memiliki 60 detik.
Meskipun praktik menunjukkan bahwa mengandalkan kebenaran pernyataan ini saat mengembangkan perangkat lunak adalah suatu khayalan. Baiklah, tidak semua poin ini adalah kesalahpahaman . Beberapa pernyataan akan benar jika bukan karena bug dan kasus edge yang mengganggu, yang telah menumpuk banyak sekali sepanjang sejarah perangkat lunak.
Setiap menit memiliki 60 detik, dan selalu ada 24 jam dalam sehari
Misalnya, di versi lama KVM di CentOS ada bug aneh - satu menit bisa berlangsung selama yang Anda suka. Faktanya adalah bahwa KVM tidak tahu bahwa itu tidak berjalan pada perangkat keras fisik, dan jika OS hosting menangguhkan sementara mesin virtual, maka jam virtual terus berjalan dari saat itu ditangguhkan . Misalnya, jika sebuah mobil dihentikan sementara pada pukul 13:00 dan diaktifkan pada pukul 15:00, jam sistem di dalamnya terus menunjukkan pukul 13:00. Akibatnya, setelah setiap jeda, ada ketidaksesuaian dengan waktu nyata. Bahkan ada tugas cron yang dapat diatur untuk menyinkronkan jam virtual dengan jam perangkat keras. Tetapi saat membuat mesin virtual baru, mudah untuk melupakannya, dan itu menyenangkan. Bug itu kemudian diperbaiki.
Selain bug, ada juga lompatan kedua (ekstra) detik: itu ditambahkan ke UTC (Waktu Universal Terkoordinasi) di penghujung hari pada tanggal 30 Juni atau 31 Desember untuk mengimbangi perlambatan bertahap rotasi Bumi dan akumulasi selisih SI dan hari astronomi - cerah - selama berhari-hari.
Adapun panjang hari, musuh utama programmer adalah transisi ke waktu musim panas, yang ada di suatu tempat, di suatu tempat tidak, dan sebelumnya dapat dibatalkan atau diperkenalkan. Ini adalah masalah besar yang terpisah dengan data historis - penghematan waktu siang hari.
Dan jika kita menambahkan ini perubahan zona waktu ...
Tentang minggu, bulan dan tahun
Tetapi cerita tentang panjang bulan dan tahun yang berbeda dikaitkan dengan perhitungan kalender yang berbeda untuk orang yang berbeda di dunia. Misalnya, kalender Ibrani beroperasi dengan bulan lunar: yaitu, awal dan akhir bulan terkait dengan fase bulan. Menurut Anda, apakah Anda dapat dengan mudah mempertimbangkan hal ini dengan menambahkan penyesuaian untuk Israel dengan pemuatan fase bulan? Tidak akan bekerja. Dalam tahun kabisat Yahudi, satu bulan ekstra ditambahkan . Selain itu - perhatikan tangan Anda - tahun sederhana dan kabisat dalam kalender Ibrani dapat memiliki tiga panjang yang berbeda . Secara total, satu tahun bisa memiliki enam masa yang berbeda.dari 354 hingga 383 hari. Apakah menurut Anda di sinilah perbedaan dari kalender kita berakhir? Dimana ada: dalam kalender Yahudi, hari memiliki durasi yang berbeda dan dihitung dari matahari terbenam hingga matahari terbenam (secara formal, ketika tiga bintang terlihat di langit).
Menurut Anda, apakah hanya untuk orang Yahudi saja yang tidak seperti dalam kalender Gregorian (dengan pertanyaan Revolusi Sosialis Oktober Besar, yang dirayakan di Uni Soviet pada 7 November)? Di negara-negara Arab:
- Seminggu tidak dimulai pada hari Senin, tetapi pada hari Minggu.
- Akhir pekan dianggap Jumat dan Sabtu, dan di beberapa negara - Kamis dan Jumat. Selama 10 tahun terakhir, beberapa negara bagian telah memindahkan akhir pekan menjadi Jumat dan Sabtu untuk memfasilitasi perdagangan internasional. Namun tidak semua negara Arab memiliki akhir pekan selama dua hari.
- Hari raya keagamaan bergantung pada pengamatan siklus bulan, sehingga waktunya tidak dapat diprediksi secara akurat.
Mengenai fakta bahwa minggu dan bulan mungkin berakhir tahun depan, ini lagi-lagi tipikal untuk negara-negara dengan kalender lunar dan solar-lunar - di dalamnya tahun baru tidak dimulai pada 1 Januari. Begitu saja, Anda bisa langsung mengingat orang Tionghoa, yang tahun barunya dimulai pada periode dari 21 Januari hingga 21 Februari menurut kalender Masehi. Dan dalam kalender Etiopia, tahun baru umumnya 29 atau 30 Agustus, dan bahkan jumlah tahun yang mereka miliki adalah 8 lebih sedikit daripada dalam sistem "sejak kelahiran Kristus".
Server dan klien akan selalu memiliki waktu yang sama
Dan di sini adalah fakta menarik, karena waktu di komputer yang berbeda mungkin tidak hanya tidak bersamaan, tetapi bahkan ukuran perbedaannya dapat bervariasi. Saat Linux melakukan boot, dibutuhkan waktu perangkat keras saat ini, dan kemudian menghitung mundur lebih lanjut, menambahkan data dari jam prosesor internal (TSC). Jam ini bisa jadi sangat tidak akurat. Misalnya, karena penskalaan jam, yang secara dinamis mengubah frekuensi TSC. Dan jika Anda mengubah frekuensi jam pada host, maka semua akun tamu bahkan tidak akan menyadarinya. Jika Anda menskalakan frekuensi TSC sebesar 50%, waktu akan mulai berjalan dua kali lebih lambat. Selain itu, pada beberapa server, BIOS dapat menskalakan frekuensi prosesor tanpa memberi tahu OS, yang juga menambah kesalahan. Pada prosesor yang lebih baru, frekuensi TSC sekarang sudah diperbaiki. Omong-omong, Windows tidak menggunakan TSC, jadi OS ini memiliki masalah lain dengan pengaturan waktu:)
Anda dapat dengan mudah menghitung jumlah jam dan menit mulai dari beberapa titik waktu
Kecuali ada sesuatu seperti Python dalam bahasa pemrograman
tzinfo()
, Anda tidak bisa mendapatkan tanggal dan waktu tertentu hanya dengan menambahkan jam dan menit ke beberapa tanggal di masa lalu. Perlu untuk mempertimbangkan zona waktu (dan kemungkinan perubahannya, seperti yang telah terjadi lebih dari sekali dalam sejarah), kemudian memperhitungkan semua perubahan dalam transisi ke waktu musim panas ... Di Windows, ini biasanya tidak mungkin, karena Microsoft hanya menyediakan awal dan akhir tahun berjalan. Anehnya, setelah begitu banyak tambalan penanganan DST, perusahaan masih belum mengimplementasikan yang setara dengan Windows
tzinfo()
. Mungkin tidak.
Waktu tidak memiliki awal dan akhir
"Program Anda tidak perlu menangani tanggal sebelum tahun 1970." Pada sistem Unix (termasuk Linux dan iOS), waktu dihitung dalam detik sejak 00:00:00 pada 1 Januari 1970 UTC (Waktu Universal Terkoordinasi). Apa pun yang lebih awal di Unix sudah akan menjadi waktu negatif. Selain itu, waktu direpresentasikan dalam ekspresi integer 32-bit, dan tanggal paling awal dalam sistem Unix adalah 13 Desember 1901. Dan waktu Unix "teratas" dibatasi hingga 19 Januari 2038, ketika jumlah detik dari awal hitung mundur mencapai 2 31 , dan angka ini dapat dianggap negatif oleh sistem.
Semua ini hanyalah sebagian kecil dari sejumlah besar nuansa dan bug yang harus dihadapi oleh pengembang produk yang memakan waktu. Tentunya Anda juga punya cerita untuk diceritakan dari pengalaman Anda, tulis di komentar.