Unix Time жөнүндө программисттердин жаңылыш түшүнүктөрү

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

кечээ Danny Мен Unix убактысы тууралуу кызыктуу фактылар жөнүндө сурадым жана кээде ал толугу менен туюмдуу иштээрин эстедим.

Бул үч факт абдан акылга сыярлык жана логикалуу көрүнөт, туурабы?

  1. Unix убактысы - 1-жылдын 1970-январынан тартып 00:00:00 UTC секунданын саны.
  2. Эгер сиз так бир секунд күтсөңүз, Unix убактысы туура бир секундага өзгөрөт.
  3. Unix убактысы эч качан артка жылбайт.

Бул бири да ушуну айтууга болот.

Бирок түшүндүрбөй туруп, жөн эле “булардын бири да туура эмес” деп айтуу аздык кылат. эмне үчүн. Түшүндүрүү үчүн төмөндө караңыз. Бирок өзүңүз ойлонгуңуз келсе, сааттын сүрөтүн жылдырбаңыз!

Unix Time жөнүндө программисттердин жаңылыш түшүнүктөрү
1770-жылдардагы стол сааты. Джон Леру тарабынан түзүлгөн. From Салам коллекциялар. Лицензия боюнча жарыяланган CC BY

Үч туура эмес түшүнүктүн тең бир себеби бар: секирик секунд. Эгер сиз секунттарды жакшы билбесеңиз, бул жерде кыскача шилтеме:

UTC убактысы эки фактор менен аныкталат:

  • Эл аралык атом убактысы: Дүйнө жүзү боюнча жүздөгөн атомдук сааттардын орточо көрсөткүчтөрү. Экинчисин атомдун электромагниттик касиеттери менен өлчөй алабыз жана бул илимге белгилүү болгон эң так убакыт өлчөөсү.
  • Дүйнөлүк убакыт, Жердин өз огунун айланасында айлануусуна негизделген. Бир толук революция бир күн.

Көйгөй бул эки сан дайыма эле дал келе бербейт. Жердин айлануусу ырааттуу эмес – ал акырындык менен жайлайт, ошондуктан Ааламдык убакыттагы күндөр узарат. Башка жагынан алганда, атомдук сааттар миллиондогон жылдар бою шайтандай так жана туруктуу.

Эки жолу шайкештешпей калганда, аларды кайра шайкештештирүү үчүн UTCден экинчиси кошулат же алынып салынат. 1972-жылдан бери кызмат кылат IERS (бул ишти иштетет) 27 кошумча секунд кошту. Натыйжада 27 секунда узактыгы менен 86 UTC күн болду. Теориялык жактан алганда, узактыгы 401 86 секунд (минус бир) менен бир күн болушу мүмкүн. Эки вариант тең 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 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 мезгилинин бирден-бир таң калыштуусу эмес - кечээги эсимде калган нерсе.

Убакыт - абдан кызык нерсе.

Source: www.habr.com

Комментарий кошуу