Proqramçıların Unix vaxtı haqqında yanlış təsəvvürləri

üzr istəyirəm Patrick McKenzie.

Dünən Danny Unix vaxtı ilə bağlı maraqlı faktlar haqqında soruşdum və onun bəzən tamamilə qeyri-intuitiv işlədiyini xatırladım.

Bu üç fakt son dərəcə ağlabatan və məntiqli görünür, elə deyilmi?

  1. Unix vaxtı 1 yanvar 1970-ci il 00:00:00 UTC tarixindən etibarən saniyələrin sayıdır.
  2. Düz bir saniyə gözləsəniz, Unix vaxtı düz bir saniyə dəyişəcək.
  3. Unix vaxtı heç vaxt geriyə doğru hərəkət etmir.

Bunların heç biri doğru deyil.

Ancaq izah etmədən sadəcə olaraq “bunların heç biri doğru deyil” demək kifayət deyil. niyə. İzahlar üçün aşağıya baxın. Ancaq özünüz düşünmək istəyirsinizsə, saatın şəklinin yanından keçməyin!

Proqramçıların Unix vaxtı haqqında yanlış təsəvvürləri
1770-ci illərdən masa saatı. John Leroux tərəfindən tərtib edilmişdir. From Xoş gəldin kolleksiyalar. Lisenziya əsasında nəşr edilmişdir CC BY

Hər üç yanlış təsəvvürün bir səbəbi var: sıçrayış saniyələri. Əgər sıçrayış saniyələri ilə tanış deyilsinizsə, burada qısa istinad var:

UTC vaxtı iki faktorla müəyyən edilir:

  • Beynəlxalq Atom Saatı: Dünya üzrə yüzlərlə atom saatının orta göstəriciləri. Biz ikincini atomun elektromaqnit xüsusiyyətləri ilə ölçə bilərik və bu, elmə məlum olan ən dəqiq zaman ölçüsüdür.
  • Dünya vaxtı, Yerin öz oxu ətrafında fırlanmasına əsaslanır. Tam bir inqilab bir gündür.

Problem ondadır ki, bu iki rəqəm həmişə üst-üstə düşmür. Yerin fırlanması ardıcıl deyil - o, tədricən yavaşlayır, buna görə də Universal Zamanda günlər uzanır. Digər tərəfdən, atom saatları milyonlarla il ərzində şeytancasına dəqiq və sabitdir.

İki dəfə sinxronizasiya pozulduqda, onları yenidən sinxronizasiya etmək üçün bir saniyə əlavə edilir və ya UTC-dən çıxarılır. 1972-ci ildən xidmət edir IERS (bu işi idarə edən) 27 əlavə saniyə əlavə etdi. Nəticə 27 saniyə davam edən 86 UTC günü olub. Nəzəri olaraq, 401 saniyə (mənfi bir) müddəti olan bir gün mümkündür. Hər iki variant Unix vaxtının əsas fərziyyəsinə ziddir.

Unix vaxtı hər günün heç bir əlavə saniyə olmadan tam olaraq 86 saniyə (400 × 60 × 60 = 24) davam etdiyini güman edir. Əgər belə bir sıçrayış baş verərsə, onda Unix vaxtı ya bir saniyə sıçrayır, ya da bir saniyədə iki saniyə sayılır. 86-cu ilə qədər 400 sıçrayış saniyəsi çatışmır.

Beləliklə, yanlış təsəvvürlərimizi aşağıdakı kimi əlavə etmək lazımdır:

  • Unix vaxtı 1 yanvar 1970-ci il 00:00:00 UTC tarixindən etibarən saniyələrin sayıdır. mənfi sıçrayış saniyələri.
  • Düz bir saniyə gözləsəniz, Unix vaxtı düz bir saniyə dəyişəcək, sıçrayış saniyəsi silinmədikdə.

    İndiyə qədər praktikada saniyələr heç vaxt silinməmişdi (və Yerin fırlanmasının yavaşlaması bunun çətin olduğunu göstərir), lakin əgər bu baş versəydi, bu, UTC gününün bir saniyə qısalacağı demək olardı. Bu halda, UTC-nin son saniyəsi (23:59:59) silinir.

    Hər Unix gününün eyni sayda saniyəsi var, ona görə də qısaldılmış günün son Unix saniyəsi heç bir UTC vaxtına uyğun gəlməyəcək. Dörddəbir saniyəlik fasilələrlə belə görünür:

    Proqramçıların Unix vaxtı haqqında yanlış təsəvvürləri

    23:59:58:00 UTC-də başlasanız və bir saniyə gözləsəniz, Unix vaxtı iki UTC saniyə irəliləyəcək və Unix 101 vaxt damğası heç kimə təyin edilməyəcək.

  • Unix vaxtı heç vaxt geri dönə bilməz, bir sıçrayış saniyə əlavə olunana qədər.

    Bu, praktikada artıq 27 dəfə baş verib. UTC gününün sonunda 23:59:60-da əlavə bir saniyə əlavə olunur. Unix bir gündə eyni sayda saniyəyə malikdir, ona görə də əlavə bir saniyə əlavə edə bilməz - bunun əvəzinə son saniyə üçün Unix vaxt işarələrini təkrarlamalıdır. Dörddəbir saniyəlik fasilələrlə belə görünür:

    Proqramçıların Unix vaxtı haqqında yanlış təsəvvürləri

    23:59:60.50-də başlasanız və yarım saniyə gözləsəniz, Unix vaxtı qayıdır yarım saniyə, Unix 101 vaxt damğası isə iki UTC saniyəyə uyğundur.

Bunlar, yəqin ki, Unix dövrünün yeganə qəribəlikləri deyil - məhz dünən xatırladıqlarım.

Vaxt - çox qəribə şey.

Mənbə: www.habr.com

Добавить комментарий