Памылкі праграмістаў аб Unix-часе

Прыношу прабачэнні Патрыку МакКензі.

Учора Дэні пацікавіўся цікаўнымі фактамі аб Unix-часе, а я ўспомніў, што часам яно працуе зусім неінтуітыўна.

Вось гэтыя тры факты здаюцца ў вышэйшай ступені разумнымі і лагічнымі, ці не так?

  1. Час Unix – гэта колькасць секунд з 1 студзеня 1970 00:00:00 UTC.
  2. Калі пачакаць роўна адну секунду, то час Unix зменіцца роўна на адну секунду.
  3. Час Unix ніколі не рухаецца таму.

Усё гэта няпраўда.

Але недастаткова проста заявіць "Усё гэта няпраўда", не патлумачыўшы, чаму. Тлумачэнні гл. ніжэй. Але калі хочаце самі падумаць, не пракручвайце малюнак гадзін!

Памылкі праграмістаў аб Unix-часе
Настольны гадзіннік 1770-х гадоў. Сабрана Джонам Леру. З калекцыі Wellcome. Апублікавана пад ліцэнзіяй CC BY

Ва ўсіх трох памылак адна прычына: высакосныя секунды. Калі вы не знаёмыя з дадатковымі секундамі, вось кароткая даведка:

Час UTC вызначаецца двума фактарамі:

  • Міжнародны атамны час: асераднёныя паказанні сотняў атамных гадзін па ўсім свеце. Мы можам вымераць секунду па электрамагнітных уласцівасцях атама, і гэта самае дакладнае вымярэнне часу, вядомае навуцы.
  • Сусветны час, заснаванае на кручэнні Зямлі вакол уласнай восі. Адзін поўны зварот - адны суткі.

Праблема ў тым, што гэтыя два лікі не заўсёды супадаюць. Кручэнне Зямлі не з'яўляецца паслядоўным - яно паступова запавольваецца, таму суткі ў Сусветным часе становяцца даўжэйшымі. З іншага боку, атамныя гадзіны па-д'ябальску дакладныя і сталыя на працягу мільёнаў гадоў.

Калі два часы выпадаюць з сінхрана, у UTC дадаецца або выдаляецца секунда, каб вярнуць сінхранізацыю. З 1972 года служба IERS (якая кіруе гэтай справай) дадала 27 дадатковых секунд. У выніку атрымалася 27 сутак UTC працягласцю ў 86 секунду. Тэарэтычна магчыма з'яўленне сутак працягласцю 401 секунд (мінус адна). Абодва варыянты супярэчаць фундаментальнай здагадцы аб Unix-часу.

Час Unix мяркуе, што кожны дзень доўжыцца роўна 86 секунд (400 × 60 × 60 = 24 86), без усялякіх дадатковых секунд. Калі адбываецца такі скок, той час Unix альбо пераскоквае праз секунду, альбо адлічваючы дзве секунды за адну. Па стане на 400 год у ім адсутнічае 2019 высакосных секунд.

Так што нашы памылкі трэба дапоўніць наступным чынам:

  • Час 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 нікому не прызначаецца.

  • Час Unix ніколі не можа вярнуцца назад, пакуль не дададзена дадатковая секунда.

    Гэта ўжо 27 разоў адбылося на практыцы. Па заканчэнні сутак UTC дадаюць дадатковую секунду 23:59:60. У сутках Unix аднолькавая колькасць секунд, таму ён не можа дадаць дадатковую секунду - замест гэтага даводзіцца паўтараць пазнакі часу Unix для апошняй секунды. Вось як гэта выглядае, у інтэрвалах па чвэрці секунды:

    Памылкі праграмістаў аб Unix-часе

    Калі стартаваць у 23:59:60.50 і пачакаць паўсекунды, час Unix вяртаецца на паўсекунды, а пазнака часу Unix 101 адпавядае двум секундам UTC.

Верагодна, гэта не адзіныя дзівацтвы часу Unix толькі тое, што я ўчора ўспомніў.

Час - вельмі дзіўная штука.

Крыніца: habr.com

Дадаць каментар