Unix vaqti haqida dasturchilarning noto'g'ri tushunchalari

uzr so'rayman Patrik Makkenzi.

Kecha Danny Men Unix vaqti haqida ba'zi qiziqarli faktlar haqida so'radim va ba'zida u butunlay intuitiv tarzda ishlashini esladim.

Bu uchta fakt juda mantiqiy va mantiqiy ko'rinadi, shunday emasmi?

  1. Unix vaqti - 1-yil 1970-yanvar 00:00:00 UTCdan boshlab soniyalar soni.
  2. Agar siz aniq bir soniya kutsangiz, Unix vaqti roppa-rosa bir soniyaga o'zgaradi.
  3. Unix vaqti hech qachon orqaga siljimaydi.

Bularning hech biri haqiqat emas.

Lekin tushuntirmasdan, oddiygina “Bularning hech biri to'g'ri emas” deyishning o'zi etarli emas. nima uchun. Tushuntirishlar uchun pastga qarang. Ammo o'zingiz o'ylab ko'rmoqchi bo'lsangiz, soatning rasmini aylanib o'tmang!

Unix vaqti haqida dasturchilarning noto'g'ri tushunchalari
1770-yillardagi stol soati. Jon Leroux tomonidan tuzilgan. Kimdan Xush kelibsiz to'plamlar. Litsenziya ostida chop etilgan CC BY

Uchta noto'g'ri tushunchaning bitta sababi bor: sakrash soniyalari. Agar siz kabisa soniyalar bilan tanish bo'lmasangiz, bu erda qisqacha ma'lumot:

UTC vaqti ikki omil bilan belgilanadi:

  • Xalqaro atom vaqti: Dunyo bo'ylab yuzlab atom soatlarining o'rtacha ko'rsatkichlari. Biz ikkinchisini atomning elektromagnit xususiyatlari bilan o'lchashimiz mumkin va bu fanga ma'lum bo'lgan vaqtning eng aniq o'lchovidir.
  • Jahon vaqti, Yerning o'z o'qi atrofida aylanishiga asoslangan. Bitta to'liq inqilob - bir kun.

Muammo shundaki, bu ikki raqam har doim ham mos kelmaydi. Yerning aylanishi izchil emas - u asta-sekin sekinlashadi, shuning uchun Umumjahon vaqtida kunlar uzoqroq bo'ladi. Boshqa tomondan, atom soatlari millionlab yillar davomida shaytoncha aniq va doimiydir.

Ikki marta sinxronlashtirilmagan bo'lsa, ularni sinxronlashtirish uchun soniya UTC dan qo'shiladi yoki o'chiriladi. 1972 yildan beri xizmat IERS (bu ishni bajaradi) qo'shimcha 27 soniya qo'shdi. Natijada 27 UTC kuni 86 401 soniya davom etdi. Nazariy jihatdan, davomiyligi 86 399 soniya (minus bir) bo'lgan kun mumkin. Ikkala variant ham Unix vaqtining asosiy taxminiga ziddir.

Unix vaqti har bir kun aniq 86 400 sekund (60 × 60 × 24 = 86 400) davom etadi, deb hisoblaydi, hech qanday qo'shimcha soniyalarsiz. Agar shunday sakrash sodir bo'lsa, Unix vaqti bir soniyaga oshadi yoki bir soniyada ikki soniya hisoblanadi. 2019 yil holatiga ko'ra, unga 27 saksa soniya yetishmaydi.

Shunday qilib, bizning noto'g'ri tushunchalarimizni quyidagicha to'ldirish kerak:

  • Unix vaqti - 1-yil 1970-yanvar 00:00:00 UTCdan boshlab soniyalar soni minus sakrash soniyalar.
  • Agar siz aniq bir soniya kutsangiz, Unix vaqti roppa-rosa bir soniyaga o'zgaradi, sakrash soniyasi olib tashlanmasa.

    Hozirgacha soniyalar amalda hech qachon olib tashlanmagan (va Yerning aylanishining sekinlashishi bu ehtimoldan yiroq ekanligini anglatadi), lekin agar bu sodir bo'lgan bo'lsa, bu UTC kunining bir soniyaga qisqarishini anglatadi. Bunday holda, UTC ning oxirgi soniyasi (23:59:59) o'chiriladi.

    Har bir Unix kuni bir xil soniyalarga ega, shuning uchun qisqartirilgan kunning oxirgi Unix soniyasi hech qanday UTC vaqtiga to'g'ri kelmaydi. Bu chorak soniya oralig'ida shunday ko'rinadi:

    Unix vaqti haqida dasturchilarning noto'g'ri tushunchalari

    Agar siz 23:59:58:00 UTC da boshlasangiz va bir soniya kutsangiz, Unix vaqti ikki UTC soniya oldinga siljiydi va Unix 101 vaqt tamg'asi hech kimga tayinlanmaydi.

  • Unix vaqti hech qachon orqaga qaytmaydi, soniya qo'shilmaguncha.

    Bu amalda allaqachon 27 marta sodir bo'lgan. UTC kunining oxirida 23:59:60 da qo'shimcha soniya qo'shiladi. Unix bir kunda bir xil soniyalarga ega, shuning uchun u qo'shimcha soniya qo'sha olmaydi - buning o'rniga u Unix vaqt belgilarini oxirgi soniyada takrorlashi kerak. Bu chorak soniya oralig'ida qanday ko'rinishga ega:

    Unix vaqti haqida dasturchilarning noto'g'ri tushunchalari

    Agar siz 23:59:60.50 da boshlasangiz va yarim soniya kutsangiz, Unix vaqti qaytmoqda yarim soniyaga, Unix 101 vaqt tamg'asi esa ikki UTC soniyaga to'g'ri keladi.

Bu, ehtimol, Unix davridagi yagona g'alati holatlar emas - kechagi esimda qolgan narsa.

Vaqt - juda ko'p g'alati narsa.

Manba: www.habr.com

a Izoh qo'shish