Camsyniadau Rhaglenwyr Am Amser Unix

Ymddiheuraf Patrick McKenzie.

Ddoe Danny Gofynnais am rai ffeithiau diddorol am amser Unix, a chofiais ei fod weithiau'n gweithio'n gwbl anreddfol.

Mae'r tair ffaith hyn yn ymddangos yn hynod resymol a rhesymegol, onid ydyn nhw?

  1. Amser Unix yw nifer yr eiliadau ers Ionawr 1, 1970 00:00:00 UTC.
  2. Os arhoswch eiliad yn union, bydd amser Unix yn newid un eiliad yn union.
  3. Nid yw amser Unix byth yn symud yn ôl.

Nid oes dim o hyn yn wir.

Ond nid yw’n ddigon dweud yn syml, “Nid oes dim o hyn yn wir,” heb esbonio. pam. Gweler isod am esboniadau. Ond os ydych chi eisiau meddwl drosoch eich hun, peidiwch â sgrolio heibio llun y cloc!

Camsyniadau Rhaglenwyr Am Amser Unix
Cloc bwrdd o'r 1770au. Lluniwyd gan John Leroux. Oddiwrth Casgliadau croeso. Cyhoeddwyd dan drwydded CC GAN

Mae gan y tri chamsyniad un rheswm: eiliadau naid. Os nad ydych chi'n gyfarwydd ag eiliadau naid, dyma gyfeirnod cyflym:

Mae amser UTC yn cael ei bennu gan ddau ffactor:

  • Amser Atomig Rhyngwladol: Darlleniadau cyfartalog o gannoedd o glociau atomig ledled y byd. Gallwn fesur yr ail yn ôl priodweddau electromagnetig atom, a dyma'r mesuriad amser mwyaf manwl gywir sy'n hysbys i wyddoniaeth.
  • Amser y Byd, yn seiliedig ar gylchdroi'r Ddaear o amgylch ei hechelin ei hun. Un chwyldro llawn yw un diwrnod.

Y broblem yw nad yw'r ddau rif hyn bob amser yn cyfateb. Nid yw cylchdro'r Ddaear yn gyson - mae'n arafu'n raddol, felly mae'r dyddiau yn Amser Cyffredinol yn dod yn hirach. Ar y llaw arall, mae clociau atomig yn gwbl gywir ac yn gyson dros filiynau o flynyddoedd.

Pan fydd dwywaith yn disgyn allan o gysoni, mae eiliad yn cael ei ychwanegu neu ei dynnu o UTC i ddod â nhw yn ôl i mewn i gysoni. Gwasanaeth ers 1972 IERS (sy'n rhedeg yr achos hwn) ychwanegu 27 eiliad ychwanegol. Y canlyniad oedd 27 diwrnod UTC gyda hyd o 86 eiliad. Yn ddamcaniaethol, mae diwrnod sy'n para 401 eiliad (llai un) yn bosibl. Mae'r ddau opsiwn yn gwrth-ddweud y dybiaeth sylfaenol o amser Unix.

Mae amser Unix yn tybio bod pob diwrnod yn para union 86 eiliad (400 × 60 × 60 = 24), heb unrhyw eiliadau ychwanegol. Os bydd naid o'r fath yn digwydd, yna mae amser Unix naill ai'n neidio un eiliad, neu'n cyfrif dwy eiliad mewn un. O 86 ymlaen, mae 400 eiliad naid ar goll.

Felly mae angen ategu ein camsyniadau fel a ganlyn:

  • Amser Unix yw nifer yr eiliadau ers 1 Ionawr, 1970 00:00:00 UTC eiliadau naid minws.
  • Os arhoswch eiliad yn union, bydd amser Unix yn newid un eiliad yn union, oni bai bod yr eiliad naid wedi'i ddileu.

    Hyd yn hyn, nid yw eiliadau erioed wedi'u dileu yn ymarferol (ac mae arafu cylchdro'r Ddaear yn golygu bod hyn yn annhebygol), ond pe bai byth yn digwydd, byddai'n golygu y byddai diwrnod yr UTC un eiliad yn fyrrach. Yn yr achos hwn, mae eiliad olaf UTC (23:59:59) yn cael ei daflu.

    Mae gan bob diwrnod Unix yr un nifer o eiliadau, felly ni fydd yr eiliad Unix olaf o ddiwrnod byrrach yn cyfateb i unrhyw amser UTC. Dyma sut olwg sydd arno, ymhen chwarteri:

    Camsyniadau Rhaglenwyr Am Amser Unix

    Os dechreuwch am 23:59:58:00 UTC ac aros un eiliad, bydd amser Unix yn symud dwy eiliad UTC ymlaen ac ni fydd stamp amser Unix 101 yn cael ei neilltuo i unrhyw un.

  • Ni all amser Unix byth fynd yn ôl, hyd nes yr ychwanegir eiliad naid.

    Mae hyn eisoes wedi digwydd 27 o weithiau yn ymarferol. Ar ddiwedd y diwrnod UTC, ychwanegir eiliad ychwanegol am 23:59:60. Mae gan Unix yr un nifer o eiliadau mewn diwrnod, felly ni all ychwanegu eiliad ychwanegol - yn lle hynny mae'n rhaid iddo ailadrodd stampiau amser Unix ar gyfer yr eiliad olaf. Dyma sut olwg sydd arno, ymhen chwarteri:

    Camsyniadau Rhaglenwyr Am Amser Unix

    Os dechreuwch am 23:59:60.50 ac aros hanner eiliad, amser Unix yn dod yn ôl erbyn hanner eiliad, ac mae stamp amser Unix 101 yn cyfateb i ddwy eiliad UTC.

Mae'n debyg nad dyma'r unig bethau rhyfedd o gyfnod Unix - dim ond yr hyn a gofiais ddoe.

Amser - iawn peth rhyfedd.

Ffynhonnell: hab.com

Ychwanegu sylw