Programmētāju maldīgie priekšstati par Unix laiku

ES atvainojos Patriks Makkenzijs.

Vakar Denijs Es jautāju par dažiem interesantiem faktiem par Unix laiku, un es atcerējos, ka dažreiz tas darbojas pilnīgi neintuitīvi.

Šie trīs fakti šķiet ārkārtīgi saprātīgi un loģiski, vai ne?

  1. Unix laiks ir sekunžu skaits kopš 1. gada 1970. janvāra 00:00:00 UTC.
  2. Ja gaidīsit tieši vienu sekundi, Unix laiks mainīsies tieši par vienu sekundi.
  3. Unix laiks nekad nepārvietojas atpakaļ.

Nekas no tā nav taisnība.

Bet nepietiek vienkārši pateikt: "Nekas no tā nav taisnība", nepaskaidrojot. kāpēc. Paskaidrojumus skatiet tālāk. Bet, ja vēlies padomāt pats, neskriini garām pulksteņa bildei!

Programmētāju maldīgie priekšstati par Unix laiku
Galda pulkstenis no 1770. gadiem. Sastādījis Džons Lerū. No Sveicināti kolekcijas. Publicēts saskaņā ar licenci CC BY

Visiem trim nepareiziem priekšstatiem ir viens iemesls: lēciena sekundes. Ja neesat pazīstams ar lēcieniem, šeit ir īsa atsauce:

UTC laiku nosaka divi faktori:

  • Starptautiskais atomlaiks: vidējie rādījumi no simtiem atompulksteņu visā pasaulē. Otro mēs varam izmērīt pēc atoma elektromagnētiskajām īpašībām, un tas ir precīzākais zinātnei zināmais laika mērījums.
  • Pasaules laiks, pamatojoties uz Zemes rotāciju ap savu asi. Viena pilna revolūcija ir viena diena.

Problēma ir tā, ka šie divi skaitļi ne vienmēr sakrīt. Zemes rotācija nav konsekventa – tā pamazām palēninās, tāpēc dienas pēc universālā laika kļūst garākas. No otras puses, atompulksteņi ir velnišķīgi precīzi un nemainīgi miljoniem gadu.

Ja divas reizes netiek sinhronizētas, sekunde tiek pievienota vai noņemta no UTC, lai tās atkal sinhronizētu. Kopš 1972. gada dienests IERS (kas darbojas šajā gadījumā) pievienoja 27 papildu sekundes. Rezultāts bija 27 UTC dienas ar ilgumu 86 401 sekunde. Teorētiski ir iespējama diena, kuras ilgums ir 86 399 sekundes (mīnus viens). Abas iespējas ir pretrunā pamatpieņēmumam par Unix laiku.

Unix laiks pieņem, ka katra diena ilgst tieši 86 400 sekundes (60 × 60 × 24 = 86 400), bez papildu sekundēm. Ja notiek šāds lēciens, Unix laiks vai nu lec par vienu sekundi, vai arī skaita divas sekundes vienā. No 2019. gada tam trūkst 27 lēciena sekundes.

Tāpēc mūsu maldīgie priekšstati ir jāpapildina šādi:

  • Unix laiks ir sekunžu skaits kopš 1. gada 1970. janvāra 00:00:00 UTC mīnus lēciena sekundes.
  • Ja gaidīsiet tieši vienu sekundi, Unix laiks mainīsies tieši par vienu sekundi, ja vien nav noņemta lēciena sekunde.

    Līdz šim praksē nekad nav noņemtas sekundes (un Zemes rotācijas palēnināšanās nozīmē, ka tas ir maz ticams), taču, ja tas kādreiz notiktu, tas nozīmētu, ka UTC diena kļūtu par sekundi īsāka. Šajā gadījumā UTC pēdējā sekunde (23:59:59) tiek atmesta.

    Katrai Unix dienai ir vienāds sekunžu skaits, tāpēc saīsinātās dienas pēdējā Unix sekunde neatbildīs nevienam UTC laikam. Lūk, kā tas izskatās ceturtdaļsekundes intervālos:

    Programmētāju maldīgie priekšstati par Unix laiku

    Ja sākat 23:59:58:00 UTC un nogaidāt vienu sekundi, Unix laiks pabīdīs divas UTC sekundes uz priekšu un Unix 101 laikspiedols nevienam netiks piešķirts.

  • Unix laiks nekad nevar atgriezties atpakaļ, līdz tiek pievienota lēciena sekunde.

    Praksē tas noticis jau 27 reizes. UTC dienas beigās 23:59:60 tiek pievienota papildu sekunde. Unix ir vienāds sekunžu skaits dienā, tāpēc tas nevar pievienot papildu sekundi - tā vietā tai ir jāatkārto Unix laikspiedoli pēdējā sekundē. Lūk, kā tas izskatās ceturtdaļsekundes intervālos:

    Programmētāju maldīgie priekšstati par Unix laiku

    Ja sākat 23:59:60.50 un gaidāt pussekundi, Unix laiks atgriežas par pussekundi, un Unix 101 laikspiedols atbilst divām UTC sekundēm.

Šīs, iespējams, nav vienīgās Unix laiku dīvainības - tikai tas, ko es atcerējos vakar.

Laiks - ļoti dīvaina lieta.

Avots: www.habr.com

Pievieno komentāru