Unix цагийн тухай програмистуудын буруу ойлголт

би уучлалт гуйж байна Патрик Маккензи.

Өчигдөр Данни Би Юниксийн цагийн тухай сонирхолтой баримтуудын талаар асуусан бөгөөд заримдаа энэ нь огт санамсаргүй ажилладаг гэдгийг санав.

Энэ гурван баримт туйлын үндэслэлтэй бөгөөд логиктой мэт санагдаж байна, тийм үү?

  1. Unix цаг нь 1 оны 1970-р сарын 00:00:00 UTC-ээс хойшхи секундын тоо юм.
  2. Хэрэв та яг нэг секунд хүлээвэл Юниксийн цаг яг нэг секундээр өөрчлөгдөнө.
  3. Unix цаг хэзээ ч ухрахгүй.

Эдгээрийн аль нь ч үнэн биш.

Гэхдээ тайлбарлахгүйгээр зүгээр л "энэ нь үнэн биш" гэж хэлэх нь хангалтгүй юм. яагаад. Тайлбарыг доороос үзнэ үү. Гэхдээ хэрэв та өөрийнхөөрөө бодохыг хүсч байвал цагны зургийг гүйлгэж болохгүй!

Unix цагийн тухай програмистуудын буруу ойлголт
1770-аад оны ширээний цаг. Эмхэтгэсэн: Жон Леру. -аас Тавтай морилно уу цуглуулгууд. Лицензийн дагуу нийтлэгдсэн CC BY

Гурван буруу ойлголт бүгд нэг шалтгаантай: үсрэлт секунд. Хэрэв та үсрэлт секундын талаар сайн мэдэхгүй бол эндээс хурдан лавлагаа байна:

UTC цагийг хоёр хүчин зүйлээр тодорхойлно:

  • Олон улсын атомын цаг: Дэлхий даяарх хэдэн зуун атомын цагны дундаж уншилтууд. Бид хоёр дахь нь атомын цахилгаан соронзон шинж чанараар хэмжиж болох бөгөөд энэ нь шинжлэх ухаанд мэдэгдэж буй цаг хугацааны хамгийн нарийн хэмжүүр юм.
  • Дэлхийн цаг, дэлхийн өөрийн тэнхлэгийг тойрон эргэхэд үндэслэсэн. Нэг бүтэн хувьсгал бол нэг өдөр.

Асуудал нь эдгээр хоёр тоо үргэлж таарч байдаггүй. Дэлхийн эргэлт тогтмол биш - энэ нь аажмаар удааширдаг тул Орчлон ертөнцийн өдрүүд уртасдаг. Нөгөөтэйгүүр, атомын цаг нь чөтгөрийн үнэн зөв бөгөөд олон сая жилийн туршид тогтмол байдаг.

Хоёр удаа синхрончлолгүй болох үед тэдгээрийг дахин синхрончлохын тулд UTC-ээс секунд нэмж эсвэл хасдаг. 1972 оноос хойш үйлчилгээ IERS (энэ хэргийг ажиллуулдаг) нэмэлт 27 секунд нэмсэн. Үр дүн нь 27 UTC өдөр, 86 секунд үргэлжилсэн. Онолын хувьд 401 секундын үргэлжлэх хугацаатай өдөр (хасах нэг) боломжтой. Хоёр сонголт хоёулаа Unix цагийн үндсэн таамаглалтай зөрчилддөг.

Unix цаг нь өдөр бүр яг 86 секунд (400 × 60 × 60 = 24) үргэлжилдэг гэж үздэг бөгөөд нэмэлт секунд байхгүй. Хэрэв ийм үсрэлт тохиолдвол Unix цаг нэг секундээр үсрэх эсвэл нэг секундэд хоёр секунд тоолно. 86 оны байдлаар 400 харайх секунд дутуу байна.

Тиймээс бидний буруу ойлголтыг дараах байдлаар нөхөх шаардлагатай байна.

  • Unix цаг нь 1 оны 1970-р сарын 00-ний 00:00:XNUMX UTC-ээс хойшхи секундын тоо юм. хасах үсрэлт секунд.
  • Хэрэв та яг нэг секунд хүлээвэл Unix цаг яг нэг секундээр өөрчлөгдөнө. үсрэлт секундийг хасаагүй бол.

    Өнөөг хүртэл секундийг практикт хэзээ ч устгаагүй (мөн дэлхийн эргэлт удааширч байгаа нь энэ нь боломжгүй гэсэн үг) боловч хэрэв ийм зүйл тохиолдвол UTC өдөр нэг секундээр богиносох болно гэсэн үг юм. Энэ тохиолдолд UTC-ийн сүүлийн секунд (23:59:59) хасагдана.

    Unix өдөр бүр ижил тооны секундтэй байдаг тул богиносгосон өдрийн сүүлийн Unix секунд нь UTC цагтай тохирохгүй. Энэ нь дөрөвний нэг секундын интервалаар дараах байдалтай байна.

    Unix цагийн тухай програмистуудын буруу ойлголт

    Хэрэв та UTC-ийн 23:59:58:00 цагт эхэлж нэг секунд хүлээх юм бол Unix цаг хоёр UTC секундээр урагшлах ба Unix 101 цагийн тэмдэг нь хэнд ч олгогдохгүй.

  • Unix цаг хэзээ ч буцаж чадахгүй, үсрэлт секунд нэмэгдэх хүртэл.

    Энэ нь практикт аль хэдийн 27 удаа тохиолдсон. UTC өдрийн төгсгөлд 23:59:60 цагт нэмэлт секунд нэмэгдэнэ. Unix нь өдөрт ижил тооны секундтэй байдаг тул нэмэлт секунд нэмэх боломжгүй - үүний оронд сүүлийн секундэд Unix цагийн тэмдэглэгээг давтах ёстой. Энэ нь дөрөвний нэг секундын интервалаар дараах байдалтай байна.

    Unix цагийн тухай програмистуудын буруу ойлголт

    Хэрэв та 23:59:60.50 цагт эхэлж хагас секунд хүлээвэл Юникс цаг буцаж ирдэг хагас секундээр, Unix 101 цагийн тэмдэг нь хоёр UTC секундтэй тохирч байна.

Эдгээр нь Юниксийн үеийн цорын ганц хачирхалтай зүйл биш байж магадгүй - өчигдөр миний санаж байсан зүйл юм.

Цаг хугацаа - маш их хачирхалтай зүйл.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх