Napačne predstave programerjev o času Unix

se opravičujem Patrick McKenzie.

Вчера Danny Vprašal sem o nekaj zanimivih dejstvih o času Unixa in spomnil sem se, da včasih deluje popolnoma neintuitivno.

Ta tri dejstva se zdijo izjemno razumna in logična, kajne?

  1. Čas Unix je število sekund od 1. januarja 1970 00:00:00 UTC.
  2. Če počakate natanko eno sekundo, se bo čas Unix spremenil za natanko eno sekundo.
  3. Unix čas se nikoli ne premakne nazaj.

Nič od tega ni res.

Vendar ni dovolj preprosto reči: "Nič od tega ni res," brez pojasnila. zakaj. Za pojasnila glejte spodaj. Če pa želite razmišljati sami, se ne pomikajte mimo slike ure!

Napačne predstave programerjev o času Unix
Namizna ura iz 1770. Sestavil John Leroux. Od Dobrodošli zbirke. Objavljeno pod licenco CC BY

Vse tri napačne predstave imajo en razlog: prestopne sekunde. Če niste seznanjeni s prestopnimi sekundami, je tukaj hitra referenca:

Čas UTC določata dva dejavnika:

  • Mednarodni atomski čas: Povprečni odčitki na stotine atomskih ur po vsem svetu. Drugo lahko izmerimo z elektromagnetnimi lastnostmi atoma in to je najnatančnejša meritev časa, kar jih pozna znanost.
  • Svetovni čas, ki temelji na vrtenju Zemlje okoli lastne osi. Ena polna revolucija je en dan.

Težava je v tem, da se ti dve številki ne ujemata vedno. Zemljino vrtenje ni dosledno – postopoma se upočasnjuje, zato se dnevi v univerzalnem času daljšajo. Po drugi strani pa so atomske ure hudičevo natančne in konstantne skozi milijone let.

Ko dva časa nista sinhronizirana, se drugi doda ali odstrani iz UTC, da ju ponovno sinhronizirata. Služba od leta 1972 IERS (ki vodi ta primer) je dodal 27 dodatnih sekund. Rezultat je bil 27 dni UTC s trajanjem 86 sekund. Teoretično je možen dan s trajanjem 401 sekund (minus ena). Obe možnosti sta v nasprotju s temeljno predpostavko o času Unix.

Čas Unix predpostavlja, da vsak dan traja natanko 86 sekund (400 × 60 × 60 = 24), brez dodatnih sekund. Če pride do takega skoka, čas Unix bodisi skoči za eno sekundo ali pa šteje dve sekundi v eni. Od leta 86 mu manjka 400 prestopnih sekund.

Torej je treba naše napačne predstave dopolniti na naslednji način:

  • Čas Unix je število sekund od 1. januarja 1970 00:00:00 UTC minus prestopne sekunde.
  • Če počakate natanko eno sekundo, se bo čas Unix spremenil za natanko eno sekundo, razen če je bila odstranjena prestopna sekunda.

    Do zdaj sekunde v praksi še nikoli niso bile odstranjene (in upočasnitev Zemljine rotacije pomeni, da je to malo verjetno), a če bi se to kdaj zgodilo, bi to pomenilo, da bi se dan UTC skrajšal za sekundo. V tem primeru se zadnja sekunda UTC (23:59:59) zavrže.

    Vsak dan Unixa ima enako število sekund, zato zadnja sekunda Unixa skrajšanega dneva ne bo ustrezala nobenemu času UTC. Takole je videti v četrtsekundnih intervalih:

    Napačne predstave programerjev o času Unix

    Če začnete ob 23:59:58:00 UTC in počakate eno sekundo, bo čas Unix napredoval za dve sekundi UTC in časovni žig Unix 101 ne bo dodeljen nikomur.

  • Čas Unix se nikoli ne more vrniti nazaj, dokler se ne doda prestopna sekunda.

    To se je v praksi zgodilo že 27-krat. Na koncu dneva UTC se doda dodatna sekunda ob 23:59:60. Unix ima enako število sekund v dnevu, zato ne more dodati dodatne sekunde - namesto tega mora ponoviti časovne žige Unixa za zadnjo sekundo. Takole je videti v četrtsekundnih intervalih:

    Napačne predstave programerjev o času Unix

    Če začnete ob 23:59:60.50 in počakate pol sekunde, je čas Unix pride nazaj za pol sekunde, časovni žig Unix 101 pa ustreza dvema sekundama UTC.

To verjetno niso edine nenavadnosti časov Unixa - samo tisto, česar sem se spomnil včeraj.

čas - zelo čudna stvar.

Vir: www.habr.com

Dodaj komentar