Salah Tanggapan Pengaturcara Mengenai Masa Unix

saya minta maaf Patrick McKenzie.

Semalam Danny Saya bertanya tentang beberapa fakta menarik tentang masa Unix, dan saya teringat bahawa kadangkala ia berfungsi sepenuhnya tanpa intuitif.

Ketiga-tiga fakta ini kelihatan sangat munasabah dan logik, bukan?

  1. Masa Unix ialah bilangan saat sejak 1 Januari 1970 00:00:00 UTC.
  2. Jika anda menunggu tepat satu saat, masa Unix akan berubah dengan tepat satu saat.
  3. Masa Unix tidak pernah bergerak ke belakang.

Semua ini tidak benar.

Tetapi tidak cukup dengan hanya mengatakan, "Tiada satu pun dari ini benar," tanpa menjelaskan. mengapa. Lihat di bawah untuk penjelasan. Tapi kalau nak fikir sendiri, jangan scroll melepasi gambar jam!

Salah Tanggapan Pengaturcara Mengenai Masa Unix
Jam meja dari tahun 1770-an. Disusun oleh John Leroux. daripada Koleksi selamat datang. Diterbitkan di bawah lesen CC BY

Ketiga-tiga salah tanggapan mempunyai satu sebab: detik lompat. Jika anda tidak biasa dengan detik lompat, berikut ialah rujukan pantas:

Masa UTC ditentukan oleh dua faktor:

  • Masa Atom Antarabangsa: Purata bacaan daripada ratusan jam atom di seluruh dunia. Kita boleh mengukur yang kedua dengan sifat elektromagnet atom, dan ini adalah ukuran masa paling tepat yang diketahui oleh sains.
  • Masa Dunia, berdasarkan putaran Bumi mengelilingi paksinya sendiri. Satu revolusi penuh adalah satu hari.

Masalahnya ialah kedua-dua nombor ini tidak selalu sepadan. Putaran Bumi tidak konsisten - ia beransur-ansur perlahan, jadi hari-hari dalam Masa Sejagat menjadi lebih panjang. Sebaliknya, jam atom adalah sangat tepat dan berterusan selama berjuta-juta tahun.

Apabila dua kali tidak disegerakkan, satu saat ditambah atau dialih keluar daripada UTC untuk menyegerakkannya semula. Sejak 1972 perkhidmatan IERS (yang menjalankan kes ini) menambah 27 saat tambahan. Keputusannya ialah 27 hari UTC dengan tempoh 86 saat. Secara teorinya, sehari dengan tempoh 401 saat (tolak satu) adalah mungkin. Kedua-dua pilihan bercanggah dengan andaian asas masa Unix.

Masa Unix mengandaikan bahawa setiap hari berlangsung tepat 86 saat (400 Γ— 60 Γ— 60 = 24), tanpa sebarang saat tambahan. Jika lompatan sedemikian berlaku, maka masa Unix sama ada melompat satu saat, atau mengira dua saat dalam satu. Sehingga 86, ia kehilangan 400 saat lompat.

Jadi salah tanggapan kita perlu ditambah seperti berikut:

  • Masa Unix ialah bilangan saat sejak 1 Januari 1970 00:00:00 UTC tolak saat lompat.
  • Jika anda menunggu tepat satu saat, masa Unix akan berubah dengan tepat satu saat, melainkan detik lompat telah dikeluarkan.

    Sehingga kini, detik tidak pernah dialih keluar dalam amalan (dan putaran Bumi yang perlahan bermakna ini tidak mungkin), tetapi jika ia pernah berlaku, ini bermakna hari UTC akan menjadi satu saat lebih pendek. Dalam kes ini, detik terakhir UTC (23:59:59) dibuang.

    Setiap hari Unix mempunyai bilangan saat yang sama, jadi saat Unix terakhir bagi hari yang dipendekkan tidak akan sepadan dengan mana-mana masa UTC. Inilah rupanya, dalam selang suku saat:

    Salah Tanggapan Pengaturcara Mengenai Masa Unix

    Jika anda bermula pada 23:59:58:00 UTC dan menunggu satu saat, masa Unix akan memajukan dua saat UTC dan cap waktu Unix 101 tidak akan diberikan kepada sesiapa.

  • Masa Unix tidak boleh kembali, sehingga satu detik lompat ditambah.

    Ini telah berlaku 27 kali dalam amalan. Pada penghujung hari UTC, satu saat tambahan ditambahkan pada 23:59:60. Unix mempunyai bilangan saat yang sama dalam sehari, jadi ia tidak boleh menambah satu saat tambahan - sebaliknya ia perlu mengulang cap masa Unix untuk saat terakhir. Inilah rupanya, dalam selang suku saat:

    Salah Tanggapan Pengaturcara Mengenai Masa Unix

    Jika anda bermula pada 23:59:60.50 dan tunggu setengah saat, masa Unix kembali dengan setengah saat, dan cap waktu Unix 101 sepadan dengan dua saat UTC.

Ini mungkin bukan satu-satunya keanehan zaman Unix - hanya apa yang saya ingat semalam.

Masa - ΠΎΡ‡Π΅Π½ΡŒ benda pelik.

Sumber: www.habr.com

Tambah komen