Unix уақыты туралы бағдарламашылардың қате түсініктері

Кешірім сұраймын Патрик Маккензи.

Кеше Дэнни Мен Unix уақыты туралы қызықты фактілер туралы сұрадым және оның кейде мүлдем интуитивтік жұмыс істейтінін есіме түсірдім.

Бұл үш факт өте ақылға қонымды және қисынды болып көрінеді, солай емес пе?

  1. Unix уақыты - 1 жылдың 1970 қаңтарынан 00:00:00 UTC бастап секундтар саны.
  2. Егер сіз дәл бір секунд күтсеңіз, Unix уақыты дәл бір секундқа өзгереді.
  3. Unix уақыты ешқашан артқа жылжымайды.

Бұлардың ешқайсысы шындыққа жанаспайды.

Бірақ түсіндірместен: «Мұның ешқайсысы да дұрыс емес» деп айту жеткіліксіз. неге. Түсіндіру үшін төменде қараңыз. Бірақ егер сіз өзіңіз ойлағыңыз келсе, сағаттың суретін айналып өтпеңіз!

Unix уақыты туралы бағдарламашылардың қате түсініктері
1770 жылдардағы үстел сағаты. Джон Леру құрастырған. бастап Сәлемдесу жинақтары. Лицензия бойынша жарияланған CC BY

Барлық үш қате түсініктің бір себебі бар: секіріс секундтары. Секундтармен таныс болмасаңыз, мұнда қысқаша анықтама:

UTC уақыты екі фактормен анықталады:

  • Халықаралық атом уақыты: Дүние жүзіндегі жүздеген атом сағаттарының орташа көрсеткіштері. Біз екіншісін атомның электромагниттік қасиеттері арқылы өлшей аламыз және бұл ғылымға белгілі уақыттың ең дәл өлшемі.
  • Әлемдік уақыт, Жердің өз осінің айналасында айналуына негізделген. Бір толық революция бір күн.

Мәселе мынада, бұл екі сан әрқашан сәйкес келмейді. Жердің айналуы біркелкі емес – ол бірте-бірте баяулайды, сондықтан Дүниежүзілік уақыттағы күндер ұзарады. Екінші жағынан, атомдық сағаттар миллиондаған жылдар бойы шайтандай дәл және тұрақты.

Екі рет синхрондалмаған кезде, оларды қайта синхрондау үшін UTC-тен секунд қосылады немесе жойылады. 1972 жылдан бері қызмет етеді IERS (бұл істі іске қосады) қосымша 27 секунд қосты. Нәтиже 27 86 секунд ұзақтығымен 401 UTC күні болды. Теориялық тұрғыдан алғанда ұзақтығы 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 уақыты туралы бағдарламашылардың қате түсініктері

    UTC 23:59:58:00-де басталып, бір секунд күтсеңіз, Unix уақыты екі UTC секундқа ілгерілейді және Unix 101 уақыт белгісі ешкімге тағайындалмайды.

  • Unix уақыты ешқашан артқа оралмайды, секіріс секунд қосылғанша.

    Бұл тәжірибеде 27 рет болған. UTC күнінің соңында қосымша секунд 23:59:60 қосылады. Unix бір күнде секундтар саны бірдей, сондықтан ол қосымша секунд қоса алмайды - оның орнына соңғы секундта Unix уақыт белгілерін қайталау керек. Ширек секундтық интервалдармен ол келесідей:

    Unix уақыты туралы бағдарламашылардың қате түсініктері

    Егер сіз 23:59:60.50-де басталып, жарты секунд күтсеңіз, Unix уақыты оралуда жарты секундқа, ал Unix 101 уақыт белгісі екі UTC секундына сәйкес келеді.

Бұл Unix уақытының жалғыз оғаштары емес шығар - кеше ғана есіме түскен нәрсе.

Уақыт - өте оғаш нәрсе.

Ақпарат көзі: www.habr.com

пікір қалдыру