Programmerers misoppfatninger om Unix-tid

jeg beklager Patrick McKenzie.

I går Danny Jeg spurte om noen interessante fakta om Unix-tid, og jeg husket at noen ganger fungerer det helt uintuitivt.

Disse tre fakta virker ekstremt rimelige og logiske, gjør de ikke?

  1. Unix-tid er antall sekunder siden 1. januar 1970 00:00:00 UTC.
  2. Hvis du venter nøyaktig ett sekund, vil Unix-tiden endres med nøyaktig ett sekund.
  3. Unix-tiden beveger seg aldri bakover.

Ingenting av dette er sant.

Men det er ikke nok å bare si: "Ingen av dette er sant," uten å forklare. Hvorfor. Se nedenfor for forklaringer. Men hvis du vil tenke selv, ikke bla forbi bildet av klokken!

Programmerers misoppfatninger om Unix-tid
Bordur fra 1770-årene. Satt sammen av John Leroux. Fra Velkomstsamlinger. Publisert under lisens CC BY

Alle tre misoppfatningene har én grunn: hoppsekunder. Hvis du ikke er kjent med skuddsekunder, her er en hurtigreferanse:

UTC-tid bestemmes av to faktorer:

  • Internasjonal atomtid: Gjennomsnittlige avlesninger fra hundrevis av atomklokker rundt om i verden. Vi kan måle det andre ved de elektromagnetiske egenskapene til et atom, og dette er den mest presise målingen av tid som er kjent for vitenskapen.
  • Verdenstid, basert på jordens rotasjon rundt sin egen akse. En hel revolusjon er en dag.

Problemet er at disse to tallene ikke alltid stemmer overens. Jordens rotasjon er ikke konsistent - den bremser gradvis ned, så dagene i Universal Time blir lengre. På den annen side er atomklokker djevelsk nøyaktige og konstante over millioner av år.

Når to ganger faller ut av synkronisering, legges et sekund til eller fjernes fra UTC for å bringe dem tilbake i synkronisering. Siden 1972 tjeneste IERS (som kjører denne saken) la til 27 ekstra sekunder. Resultatet var 27 UTC-dager med en varighet på 86 401 sekunder. Teoretisk sett er en dag med en varighet på 86 399 sekunder (minus ett) mulig. Begge alternativene motsier den grunnleggende antagelsen om Unix-tid.

Unix-tid antar at hver dag varer nøyaktig 86 400 sekunder (60 × 60 × 24 = 86 400), uten ekstra sekunder. Hvis et slikt hopp skjer, hopper Unix-tiden enten ett sekund, eller teller to sekunder i ett. Fra og med 2019 mangler den 27 skuddsekunder.

Så våre misoppfatninger må suppleres som følger:

  • Unix-tid er antall sekunder siden 1. januar 1970 00:00:00 UTC minus hoppsekunder.
  • Hvis du venter nøyaktig ett sekund, endres Unix-tiden med nøyaktig ett sekund, med mindre sprangsekundet er fjernet.

    Til nå har sekunder aldri blitt fjernet i praksis (og nedgangen i jordens rotasjon betyr at dette er usannsynlig), men hvis det noen gang skjedde, ville det bety at UTC-dagen ville bli ett sekund kortere. I dette tilfellet blir siste sekund av UTC (23:59:59) forkastet.

    Hver Unix-dag har samme antall sekunder, så det siste Unix-sekundet av en forkortet dag vil ikke tilsvare noen UTC-tid. Slik ser det ut i kvart sekunds intervaller:

    Programmerers misoppfatninger om Unix-tid

    Hvis du starter klokken 23:59:58:00 UTC og venter ett sekund, vil Unix-tiden gå to UTC-sekunder og Unix 101-tidsstemplet vil ikke bli tildelt noen.

  • Unix-tiden kan aldri gå tilbake, til et sprangsekund er lagt til.

    Dette har allerede skjedd 27 ganger i praksis. På slutten av UTC-dagen legges et ekstra sekund til klokken 23:59:60. Unix har samme antall sekunder på en dag, så den kan ikke legge til et ekstra sekund – i stedet må den gjenta Unix-tidsstemplene for siste sekund. Slik ser det ut i kvart sekunds intervaller:

    Programmerers misoppfatninger om Unix-tid

    Hvis du starter klokken 23:59:60.50 og venter et halvt sekund, er Unix-tiden kommer tilbake med et halvt sekund, og Unix 101-tidsstemplet tilsvarer to UTC-sekunder.

Dette er sannsynligvis ikke de eneste raritetene i Unix-tiden - akkurat det jeg husket i går.

Tid - veldig rar ting.

Kilde: www.habr.com

Legg til en kommentar