Programmerares missuppfattningar om Unix-tid

Jag ber om ursäkt Patrick McKenzie.

i går Danny Jag frågade om några intressanta fakta om Unix-tid, och jag kom ihåg att det ibland fungerar helt ointuitivt.

Dessa tre fakta verkar extremt rimliga och logiska, eller hur?

  1. Unix-tid är antalet sekunder sedan 1 januari 1970 00:00:00 UTC.
  2. Om du väntar exakt en sekund kommer Unix-tiden att ändras med exakt en sekund.
  3. Unix-tiden går aldrig bakåt.

Inget av detta är sant.

Men det räcker inte att bara säga "Inget av detta är sant" utan att förklara. Varför. Se nedan för förklaringar. Men om du vill tänka själv, scrolla inte förbi bilden på klockan!

Programmerares missuppfattningar om Unix-tid
Bordsur från 1770-talet. Sammanställd av John Leroux. Från Välkommen samlingar. Publicerad under licens CC BY

Alla tre missuppfattningarna har en anledning: skottsekunder. Om du inte är bekant med skottsekunder, här är en snabbreferens:

UTC-tiden bestäms av två faktorer:

  • Internationell atomtid: Medelvärden från hundratals atomur runt om i världen. Vi kan mäta den andra genom de elektromagnetiska egenskaperna hos en atom, och detta är den mest exakta tidsmätningen som vetenskapen känner till.
  • Världstid, baserat på jordens rotation runt sin egen axel. En hel revolution är en dag.

Problemet är att dessa två siffror inte alltid matchar. Jordens rotation är inte konsekvent - den saktar gradvis ner, så dagarna i Universal Time blir längre. Å andra sidan är atomklockor djävulskt exakta och konstanta över miljoner år.

När två gånger faller ur synkronisering läggs en andra till eller tas bort från UTC för att få dem tillbaka i synkronisering. Sedan 1972 tjänst IERS (som kör det här fallet) lade till 27 extra sekunder. Resultatet blev 27 UTC-dagar med en varaktighet på 86 401 sekunder. Teoretiskt sett är en dag med en varaktighet på 86 399 sekunder (minus en) möjlig. Båda alternativen motsäger det grundläggande antagandet om Unix-tid.

Unix-tiden antar att varje dag varar exakt 86 400 sekunder (60 × 60 × 24 = 86 400), utan några ytterligare sekunder. Om ett sådant hopp inträffar, hoppar Unix-tiden antingen en sekund eller räknar två sekunder i en. Från och med 2019 saknas det 27 skottsekunder.

Så våra missuppfattningar behöver kompletteras enligt följande:

  • Unix-tid är antalet sekunder sedan 1 januari 1970 00:00:00 UTC minus skottsekunder.
  • Om du väntar exakt en sekund kommer Unix-tiden att ändras med exakt en sekund, om inte skottsekunden har tagits bort.

    Hittills har sekunder aldrig tagits bort i praktiken (och avmattningen av jordens rotation betyder att detta är osannolikt), men om det någonsin hände skulle det innebära att UTC-dagen skulle bli en sekund kortare. I det här fallet kasseras den sista sekunden av UTC (23:59:59).

    Varje Unix-dag har samma antal sekunder, så den sista Unix-sekunden av en förkortad dag kommer inte att motsvara någon UTC-tid. Så här ser det ut i kvartssekundsintervaller:

    Programmerares missuppfattningar om Unix-tid

    Om du startar 23:59:58:00 UTC och väntar en sekund, kommer Unix-tiden att gå två UTC-sekunder och Unix 101-tidsstämpeln kommer inte att tilldelas någon.

  • Unix-tiden kan aldrig gå tillbaka, tills en skottsekund läggs till.

    Detta har redan hänt 27 gånger i praktiken. I slutet av UTC-dagen läggs ytterligare en sekund till klockan 23:59:60. Unix har samma antal sekunder på en dag, så det kan inte lägga till en extra sekund – istället måste det upprepa Unix-tidsstämplarna för sista sekunden. Så här ser det ut i kvartssekundsintervaller:

    Programmerares missuppfattningar om Unix-tid

    Om du börjar 23:59:60.50 och väntar en halv sekund, Unix-tiden kommer tillbaka med en halv sekund, och Unix 101-tidsstämpeln motsvarar två UTC-sekunder.

Det här är förmodligen inte de enda konstigheterna i Unix-tiden - bara vad jag kom ihåg igår.

Tid - mycket konstig sak.

Källa: will.com

Lägg en kommentar