Заблуди на програмерите за Unix Time

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

Вчера Дени Прашав за некои интересни факти за времето на Unix и се сетив дека понекогаш тоа функционира сосема неинтуитивно.

Овие три факти изгледаат крајно разумни и логични, нели?

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

Ништо од ова не е точно.

Но, не е доволно едноставно да се каже: „Ништо од ова не е вистина“, без објаснување. зошто. Видете подолу за објаснувања. Но, ако сакате да размислите сами, не скролувајте покрај сликата на часовникот!

Заблуди на програмерите за Unix Time
Табеларен часовник од 1770-тите. Составен од Џон Леру. Од Добредојдовте колекции. Објавено под лиценца CC BY

Сите три заблуди имаат една причина: престапни секунди. Ако не сте запознаени со престапните секунди, еве брза референца:

Времето UTC се определува од два фактори:

  • Меѓународно атомско време: Просечни отчитувања од стотици атомски часовници ширум светот. Можеме да го измериме вториот според електромагнетните својства на атомот, а ова е најпрецизното мерење на времето познато на науката.
  • Светско време, врз основа на ротацијата на Земјата околу сопствената оска. Една целосна револуција е еден ден.

Проблемот е што овие два броја не секогаш се совпаѓаат. Ротацијата на Земјата не е конзистентна - таа постепено се забавува, па деновите во универзалното време стануваат подолги. Од друга страна, атомските часовници се ѓаволски прецизни и постојани во текот на милиони години.

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

Unix времето претпоставува дека секој ден трае точно 86 секунди (400 × 60 × 60 = 24), без никакви дополнителни секунди. Ако се случи таков скок, тогаш времето на Unix или скока една секунда, или брои две секунди во една. Од 86 година, му недостасуваат 400 престапни секунди.

Значи, нашите заблуди треба да се дополнат на следниов начин:

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

    Досега, секундите никогаш не биле отстранети во пракса (а забавувањето на ротацијата на Земјата значи дека тоа е малку веројатно), но ако некогаш се случило, тоа би значело дека денот UTC ќе стане за една секунда пократок. Во овој случај, последната секунда од UTC (23:59:59) е отфрлена.

    Секој ден на Unix има ист број на секунди, така што последната Unix секунда од скратениот ден нема да одговара на кое било време UTC. Еве како изгледа тоа во интервали од четвртина секунда:

    Заблуди на програмерите за Unix Time

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

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

    Ова веќе се случи 27 пати во пракса. На крајот од UTC денот, се додава дополнителна секунда во 23:59:60. Unix има ист број секунди во еден ден, така што не може да додаде дополнителна секунда - наместо тоа, мора да ги повторува временските ознаки на Unix за последната секунда. Еве како изгледа тоа во интервали од четвртина секунда:

    Заблуди на програмерите за Unix Time

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

Ова веројатно не се единствените необичности на времињата на Unix - токму она што се сетив вчера.

Време - многу чудна работа.

Извор: www.habr.com

Додадете коментар