Погрешни схващания на програмистите относно времето на Unix

извинявам се Патрик Маккензи.

Вчера Дани Попитах за някои интересни факти за времето на Unix и се сетих, че понякога работи напълно неинтуитивно.

Тези три факта изглеждат изключително разумни и логични, нали?

  1. Unix времето е броят секунди от 1 януари 1970 г. 00:00:00 UTC.
  2. Ако изчакате точно една секунда, времето в Unix ще се промени точно с една секунда.
  3. Unix времето никога не се движи назад.

Нищо от това не е вярно.

Но не е достатъчно просто да кажете „Нищо от това не е вярно“, без да обяснявате. защо. Вижте по-долу за обяснения. Но ако искате да мислите сами, не превъртайте покрай снимката на часовника!

Погрешни схващания на програмистите относно времето на Unix
Настолен часовник от 1770 г. Съставител Джон Леру. от Добре дошли колекции. Публикувано под лиценз CC BY

И трите погрешни схващания имат една причина: високосни секунди. Ако не сте запознати с високосните секунди, ето бърза справка:

UTC времето се определя от два фактора:

  • Международно атомно време: Средни показания от стотици атомни часовници по света. Можем да измерим второто чрез електромагнитните свойства на атома и това е най-точното измерване на времето, известно на науката.
  • Световно време, основан на въртенето на Земята около собствената си ос. Една пълна революция е един ден.

Проблемът е, че тези две числа не винаги съвпадат. Въртенето на Земята не е последователно - то постепенно се забавя, така че дните във Всемирното време стават по-дълги. От друга страна, атомните часовници са дяволски точни и постоянни в продължение на милиони години.

Когато две времена изпаднат от синхронизиране, второ се добавя или премахва от UTC, за да ги върне в синхрон. От 1972 г. служба IERS (който изпълнява този случай) добави 27 допълнителни секунди. Резултатът беше 27 UTC дни с продължителност 86 401 секунди. Теоретично е възможен ден с продължителност 86 399 секунди (минус едно). И двете опции противоречат на фундаменталното предположение за времето на Unix.

Времето на Unix предполага, че всеки ден продължава точно 86 400 секунди (60 × 60 × 24 = 86 400), без никакви допълнителни секунди. Ако се случи такъв скок, тогава Unix времето или скача с една секунда, или брои две секунди в една. Към 2019 г. липсват 27 високосни секунди.

Така че нашите погрешни схващания трябва да бъдат допълнени, както следва:

  • Unix времето е броят секунди от 1 януари 1970 г. 00:00:00 UTC минус високосни секунди.
  • Ако изчакате точно една секунда, времето на Unix ще се промени точно с една секунда, освен ако високосната секунда не е премахната.

    Досега секундите никога не са били премахвани на практика (и забавянето на въртенето на Земята означава, че това е малко вероятно), но ако някога се случи, това би означавало, че UTC денят ще стане с една секунда по-къс. В този случай последната секунда от UTC (23:59:59) се отхвърля.

    Всеки Unix ден има еднакъв брой секунди, така че последната Unix секунда от съкратен ден няма да съответства на UTC време. Ето как изглежда в интервали от четвърт секунди:

    Погрешни схващания на програмистите относно времето на Unix

    Ако започнете в 23:59:58:00 UTC и изчакате една секунда, Unix времето ще напредне с две UTC секунди и Unix 101 timestamp няма да бъде присвоен на никого.

  • Unix времето никога не може да се върне назад, докато се добави високосна секунда.

    Това се е случило вече 27 пъти на практика. В края на деня UTC се добавя допълнителна секунда в 23:59:60. Unix има същия брой секунди на ден, така че не може да добави допълнителна секунда - вместо това трябва да повтори времевите марки на Unix за последната секунда. Ето как изглежда в интервали от четвърт секунди:

    Погрешни схващания на програмистите относно времето на Unix

    Ако започнете в 23:59:60.50 и изчакате половин секунда, времето на Unix се връща с половин секунда, а клеймото за време Unix 101 съответства на две UTC секунди.

Това вероятно не са единствените странности от времето на Unix - само това, което си спомних вчера.

време - много странно нещо.

Източник: www.habr.com

Добавяне на нов коментар