ЗаблуТдСния программистов ΠΎ 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 сСкунду. ВСорСтичСски Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ появлСниС суток ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ 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 Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ назначаСтся.

  • ВрСмя Unix Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π½Π°Π·Π°Π΄, ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ сСкунда.

    Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ 27 Ρ€Π°Π· ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ суток UTC Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ сСкунду 23:59:60. Π’ сутках Unix ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство сСкунд, поэтому ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ сСкунду — вмСсто этого приходится ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Unix для послСднСй сСкунды. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит, Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ… ΠΏΠΎ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΈ сСкунды:

    ЗаблуТдСния программистов ΠΎ Unix-Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

    Если ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ Π² 23:59:60.50 ΠΈ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ полсСкунды, врСмя Unix возвращаСтся Π½Π° полсСкунды, Π° ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Unix 101 соотвСтствуСт Π΄Π²ΡƒΠΌ сСкундам UTC.

ВСроятно, это Π½Π΅ СдинствСнныС странности Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Unix β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Π²Ρ‡Π΅Ρ€Π° вспомнил.

ВрСмя — ΠΎΡ‡Π΅Π½ΡŒ странная ΡˆΡ‚ΡƒΠΊΠ°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com