Programmørers misforståelser om Unix-tid

jeg undskylder Patrick McKenzie.

i går Danny Jeg spurgte om nogle interessante fakta om Unix-tid, og jeg huskede, at det nogle gange virker fuldstændig uintuitivt.

Disse tre fakta virker yderst rimelige og logiske, gør de ikke?

  1. Unix-tid er antallet af sekunder siden 1. januar 1970 00:00:00 UTC.
  2. Hvis du venter præcis et sekund, ændres Unix-tiden med nøjagtigt et sekund.
  3. Unix-tiden bevæger sig aldrig baglæns.

Intet af dette er sandt.

Men det er ikke nok blot at sige: "Intet af dette er sandt," uden at forklare. hvorfor. Se nedenfor for forklaringer. Men hvis du vil tænke selv, skal du ikke scrolle forbi billedet af uret!

Programmørers misforståelser om Unix-tid
Bordur fra 1770'erne. Kompileret af John Leroux. Fra Velkomst samlinger. Udgivet under licens CC BY

Alle tre misforståelser har én grund: spring sekunder. Hvis du ikke er bekendt med skudsekunder, er her en hurtig reference:

UTC-tiden bestemmes af to faktorer:

  • International Atomtid: Gennemsnitlige aflæsninger fra hundredvis af atomure rundt om i verden. Vi kan måle den anden ved et atoms elektromagnetiske egenskaber, og dette er den mest præcise måling af tid, som videnskaben kender.
  • Verdenstid, baseret på Jordens rotation omkring sin egen akse. En hel revolution er en dag.

Problemet er, at disse to tal ikke altid stemmer overens. Jordens rotation er ikke konsistent – ​​den bremses gradvist, så dagene i Universal Time bliver længere. På den anden side er atomure djævelsk nøjagtige og konstante over millioner af år.

Når to gange falder ud af synkronisering, tilføjes eller fjernes en anden fra UTC for at bringe dem tilbage i synkronisering. Siden 1972 tjeneste IERS (som kører denne sag) tilføjet 27 ekstra sekunder. Resultatet var 27 UTC-dage med en varighed på 86 sekunder. Teoretisk set er en dag med en varighed på 401 sekunder (minus et) mulig. Begge muligheder modsiger den grundlæggende antagelse om Unix-tid.

Unix-tiden antager, at hver dag varer præcis 86 sekunder (400 × 60 × 60 = 24), uden yderligere sekunder. Hvis et sådant spring forekommer, springer Unix-tiden enten et sekund eller tæller to sekunder i ét. Fra 86 mangler den 400 skudsekunder.

Så vores misforståelser skal suppleres som følger:

  • Unix-tid er antallet af sekunder siden 1. januar 1970 00:00:00 UTC minus skudsekunder.
  • Hvis du venter præcis et sekund, ændres Unix-tiden med nøjagtigt et sekund, medmindre springsekundet er blevet fjernet.

    Indtil nu er sekunder aldrig blevet fjernet i praksis (og opbremsningen af ​​Jordens rotation betyder, at dette er usandsynligt), men hvis det nogensinde skete, ville det betyde, at UTC-dagen ville blive et sekund kortere. I dette tilfælde kasseres det sidste sekund af UTC (23:59:59).

    Hver Unix-dag har det samme antal sekunder, så det sidste Unix-sekund af en forkortet dag vil ikke svare til nogen UTC-tid. Sådan ser det ud i et kvarts sekunds intervaller:

    Programmørers misforståelser om Unix-tid

    Hvis du starter kl. 23:59:58:00 UTC og venter et sekund, vil Unix-tiden gå to UTC-sekunder frem, og Unix 101-tidsstemplet vil ikke blive tildelt nogen.

  • Unix tid kan aldrig gå tilbage, indtil der tilføjes et skudsekund.

    Det er allerede sket 27 gange i praksis. Ved slutningen af ​​UTC-dagen tilføjes et ekstra sekund kl. 23:59:60. Unix har det samme antal sekunder på en dag, så den kan ikke tilføje et ekstra sekund – i stedet skal den gentage Unix-tidsstemplene i det sidste sekund. Sådan ser det ud i et kvarts sekunds intervaller:

    Programmørers misforståelser om Unix-tid

    Hvis du starter kl. 23:59:60.50 og venter et halvt sekund, er Unix-tiden kommer tilbage med et halvt sekund, og Unix 101-tidsstemplet svarer til to UTC-sekunder.

Det er nok ikke de eneste mærkværdigheder i Unix-tiden - lige hvad jeg huskede i går.

Tid - meget mærkelig ting.

Kilde: www.habr.com

Tilføj en kommentar