เวลา Unix / เวลาเป็นทางการอยู่ที่ไหน [ปิด]


20

สิ่งที่ปฏิเสธความรับผิดชอบ:

ฉันเพิ่งผ่านรายการของไซต์ StackExchange ประมาณ 20 นาทีพยายามที่จะโพสต์สิ่งนี้ หากคุณรู้จักเว็บไซต์ใดที่เหมาะสมกว่าโปรดย้ายคำถามนี้ไปที่นั่น ฉันโพสต์ที่นี่เพราะเวลายูนิกซ์ทำให้ฉันคิด


อย่างที่เรารู้มีเวลายูนิกซ์และมี UTC เวลาของยูนิกซ์เพียงแค่ทำการติ๊กนับวินาที - หนึ่งวินาทีต่อวินาที - ในขณะที่ UTC พยายามเก็บเวลาในรูปแบบที่มนุษย์สามารถอ่านได้ที่เราใช้สอดคล้องกับเฟสของโลกในการหมุน เมื่อต้องการทำเช่นนี้ UTC จะแทรกวินาทีกระโดดเป็นครั้งคราว

เนื่องจากเวลามีความสัมพันธ์กับแรงโน้มถ่วงของวัตถุที่มีเวลาสัมผัสกับการเร่งความเร็วชนิดอื่นและความเร็วสัมพัทธ์สิ่งนี้นำไปสู่คำถาม 2 ข้อ ลองมาดูสิ่งที่ง่ายกว่าก่อน: การวัดเวลาของยูนิกซ์อยู่ที่ไหน? ถ้าอลิซและบ๊อบเริ่มเห็นด้วยกับเวลาปัจจุบันคือ 1467932496.42732894722748 เมื่อพวกเขาอยู่ในที่เดียวกัน (หนึ่งในสองถูกกำหนดเป็น 9'192'631'770 รอบของการแผ่รังสีที่สอดคล้องกับการเปลี่ยนแปลงระหว่างสองระดับพลังงานของซีเซียม-133 อะตอมที่พักผ่อนและที่ 0 K) พบกับความขัดแย้งคู่เนื่องจากอลิซอาศัยอยู่ที่ระดับน้ำทะเลและบ๊อบอยู่สูงขึ้นไปบนภูเขาหรืออลิซอาศัยอยู่ที่ขั้วโลกเหนือและบ็อบอาศัยอยู่ที่เส้นศูนย์สูตรพวกเขาจะไม่เห็นด้วยอีกต่อไป ดังนั้นเวลายูนิกซ์จะถูกกำหนดอย่างไร

คุณอาจไม่เห็นปัญหากับ UTC ในตอนแรกเพราะแน่นอนว่าทุกคนสามารถตกลงกันได้เมื่อโลกโคจรรอบเสร็จ (แน่นอนว่ามันไม่สนใจการเคลื่อนที่ของแผ่นทวีป แต่ผมคิดว่าเราได้สิ่งนั้นมาเป็นอย่างดีเพราะด้วย GPS แม่นยำมากและเราสามารถสันนิษฐานได้ว่าพวกเขาอยู่ในตำแหน่งที่กำหนดไว้ในแบบจำลองของเราและไม่เคลื่อนที่เป็นแผ่นเปลือกโลกทวีป) ไม่ว่าพวกเขาจะอยู่บนภูเขาในระดับน้ำทะเลบนเส้นศูนย์สูตรหรือที่ขั้วโลกเหนือ อาจมีความแตกต่างของเวลา แต่ก็ไม่ได้สะสม

แต่วินาทีนั้นถูกกำหนดให้เป็น 9'192'631'770 รอบของการแผ่รังสีที่สอดคล้องกับการเปลี่ยนแปลงระหว่างสองระดับพลังงานของอะตอมซีเซียม-133 ที่เหลือและที่ 0 K และซีเซียม-133 อะตอมไม่สนใจเกี่ยวกับวงโคจรของโลก ดังนั้น UTC ตัดสินใจที่จะแทรกวินาทีกระโดด แต่จะต้องมีการวัดหรือคาดการณ์การเปลี่ยนแปลงระหว่างเฟสของวงโคจรของโลกและเวลาที่วัดที่ไหนสักแห่งโดยนาฬิกาอะตอม อยู่ที่ไหนสักแห่ง?


5
"เวลา Unix เพียงแค่เริ่มเดินติ๊กนับวินาที - หนึ่งวินาทีต่อวินาที" - จริง ๆ แล้วมันไม่ได้ สิ่งต่าง ๆ จะง่ายขึ้นถ้ามันทำ
ฮอบส์

3
คำถามที่ฉันคิดว่าคุณตั้งใจจะถามจะอยู่ในหัวข้อทางฟิสิกส์ - แต่เป็นคำถามเกี่ยวกับมาตรฐานเวลาเช่น UTC และไม่มีส่วนเกี่ยวข้องกับเวลาของ UNIX ดูเพิ่มเติมที่นี่และนี่และคำถามที่เกี่ยวข้องอื่น ๆ
David Z

7
ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเรื่องเพราะมันเกี่ยวกับฟิสิกส์การเมืองและมาตรฐานทางโลก แต่ไม่ใช่ Unix
Michael Homer

3
นอกจากนี้อาจจะเกี่ยวกับหัวข้อคำถามที่ใดที่หนึ่งในบริเวณนี้ที่คุณจะได้ถาม แต่ผมไม่คิดว่ามันเป็น มันมี "... แล้ว Unix ล่ะ?" โยนในคำถามที่ไม่เกี่ยวข้องเป็นครั้งคราวตามคำตอบที่แสดง
Michael Homer

1
ที่เกี่ยวข้อง: Unix วินาที, TAI (SI) วินาทีวินาทีกระโดดและโลกจริงรหัส
Scott

คำตอบ:


30

คำถามหัวข้อของคุณไม่มีคำตอบจริง เวลา Unix ไม่ใช่เวลาจริงและไม่ใช่ "วัด" ได้ทุกที่ มันเป็นตัวแทนของ UTC แม้ว่าจะเป็นรุ่นที่แย่เพราะมีช่วงเวลาใน UTC ที่ไม่สามารถเป็นตัวแทนได้ เวลา Unix ยืนยันว่ามี 86,400 วินาทีในทุกวัน แต่ UTC เบี่ยงเบนไปจากนั้นเนื่องจากวินาทีกระโดด

สำหรับคำถามที่กว้างขึ้นของคุณมีช่วงเวลาสำคัญสี่ช่วงเวลาที่น่าสนใจ:

  1. UT1 (Universal Time) ซึ่งคำนวณโดยหอสังเกตการณ์ทั่วโลกที่วัดการหมุนของโลกเทียบกับดาวฤกษ์คงที่ ด้วยการสังเกตและคณิตศาสตร์เล็ก ๆ น้อย ๆ เราได้รับ Greenwich Mean Time รุ่นเก่าซึ่งขึ้นอยู่กับช่วงเวลาของเวลาเที่ยงวันอาทิตย์ที่ Royal Observatory ใน Greenwich เวลาสากลคำนวณโดยองค์กรที่เรียกว่าIERS (บริการการหมุนรอบโลกและระบบอ้างอิงสากลซึ่งเดิมคือบริการการหมุนรอบโลกสากล)

  2. TAI (International Atomic Time) ซึ่งถูกเก็บรักษาโดยนาฬิกาอะตอมหลายร้อยแห่งทั่วโลกดูแลโดยหน่วยงานมาตรฐานระดับชาติและเช่นนั้น ผู้ดูแลนาฬิกาที่ส่งผลให้ TAI ใช้เทคนิคการถ่ายโอนเวลาเพื่อคัดท้ายนาฬิกาของพวกเขาต่อกันยกเลิกข้อผิดพลาดเล็ก ๆ ของนาฬิกาแต่ละเรือนและสร้างเวลารวมกัน ชุดนั้นคือ TAI เผยแพร่โดยสำนักน้ำหนักและมาตรการระหว่างประเทศ (BIPM) ซึ่งเป็นผู้พิทักษ์ระบบ SI ของหน่วย ในการตอบคำถามของคุณเกี่ยวกับการขยายเวลา TAI ถูกกำหนดให้เป็นเวลาอะตอมที่ระดับน้ำทะเล (จริง ๆ แล้วที่ geoid ซึ่งเป็นแนวคิดที่เหมือนกันมากขึ้นในความคิดเดียวกัน) และแต่ละนาฬิกาจะแก้ไขผลกระทบจากระดับความสูงของตัวเอง

  3. UTC (เวลาสากลเชิงพิกัด) UTC ถูกตั้งค่าให้เท่ากับสิบวินาทีหลัง TAI ในวันที่ 1 มกราคม 1972 และนับจากวันที่มันทำเครื่องหมายส่งต่อในอัตราเดียวกับ TAI ยกเว้นเมื่อมีการเพิ่มหรือลบวินาทีกระโดด IERS ทำการตัดสินใจที่จะประกาศการก้าวกระโดดเพื่อให้เกิดความแตกต่างภายใน 0.9 วินาที (ในทางปฏิบัติภายในประมาณ 0.6 วินาทีการเพิ่มการกระโดดครั้งที่สองทำให้เกิดความแตกต่างจาก -0.6 ถึง +0.4) ในทางทฤษฎีวินาทีกระโดดสามารถเป็นได้ทั้งบวกและลบ แต่เนื่องจากการหมุนของโลกช้าลงเมื่อเทียบกับมาตรฐานที่กำหนดโดย SI และ TAI วินาทีก้าวกระโดดเชิงลบไม่เคยมีความจำเป็นและอาจจะไม่เคยจะ

  4. เวลา Unix ซึ่งจะดีที่สุดในการแสดง UTC เป็นตัวเลขเดียว ทุกเวลาของระบบปฏิบัติการ Unix ที่มีค่าเท่ากับ 86,400 สอดคล้องกับเวลาเที่ยงคืน UTC เนื่องจากไม่ใช่ UTC ทุกวันมีความยาว 86,400 วินาที แต่ "Unix วัน" ทั้งหมดมีความแตกต่างที่ไม่สามารถแก้ไขได้ที่ต้องได้รับการแก้ไขอย่างใด ไม่มีเวลา Unix ที่สอดคล้องกับวินาทีกระโดดเพิ่ม ในทางปฏิบัติระบบจะทำหน้าที่เหมือนกับวินาทีก่อนหน้านี้เกิดขึ้นสองครั้ง (ด้วยยูนิกซ์เวลากระโดดถอยหลังไปหนึ่งวินาทีจากนั้นดำเนินการไปข้างหน้าอีกครั้ง) หรือใช้เทคนิคเช่นการกระโดดเผ็ดที่ทำให้เวลาแปรปรวนเป็นเวลานาน ก้าวกระโดดครั้งที่สอง ไม่ว่าในกรณีใดมีบางอย่างไม่ถูกต้องแม้ว่าอย่างน้อยที่สองคือ monotonic ในทั้งสองกรณี,และbไม่เท่ากับ ba; มันเท่ากับ ba บวกจำนวนวินาทีของการกระโดดเพิ่ม

ตั้งแต่ UT1, TAI, UTC และ IERS ล้วนแล้วแต่เป็นความพยายามระดับนานาชาติดังนั้นจึงไม่มีคำว่า "ที่ไหน" ถึงแม้ว่าจะมีการเผยแพร่แถลงการณ์ของ IERS จากหอดูดาวปารีสและ BIPM ก็อยู่ในปารีสนั่นคือคำตอบเดียว องค์กรที่ต้องการเวลาที่แม่นยำและตรวจสอบย้อนกลับได้อาจระบุระยะเวลาของตนว่าเป็น "UTC (USNO)" ซึ่งหมายความว่าการประทับเวลาของพวกเขาอยู่ใน UTC และพวกเขามาจากเวลาที่หอสังเกตการณ์กองทัพเรือสหรัฐ แต่ได้รับปัญหา ฉันพูดถึงเวลา Unix โดยพื้นฐานแล้วมันไม่เข้ากับความแม่นยำระดับนั้น - ใครก็ตามที่จัดการกับเวลาที่แม่นยำจริงๆจะมีทางเลือกแทนเวลา Unix


1
คุณเคยมองข้ามการดำรงอยู่ของเขตเวลาที่อยู่ในระบบโอลสันและวิธีการที่พวกเขาถือว่าright/ time_t
JdeBP

1
@JdeBP จริง ๆ แล้วฉันไม่เคยได้ยินเรื่องนี้ ฉันคิดว่ามันค่อนข้างน่าสงสัยที่จะเรียกเวลา Unix ว่าเมื่อเทียบกับทั้ง POSIX และการประชุมที่ยาวนาน แต่ก็เป็นข้อมูลที่มีค่าอยู่ดี บางทีคุณสามารถเพิ่มคำตอบเกี่ยวกับเรื่องนี้?
ฮอบส์

1
วิธีที่ง่ายที่สุดในการได้รับแหล่งเวลาที่แม่นยำสำหรับคนทั่วไปคือเครื่องรับ GPS นาฬิกาบนดาวเทียมได้รับการซิงโครไนซ์กับ TAI และสัญญาณมีความแม่นยำถึง10⁻⁸s (โดยไม่มีการแก้ไข; ด้วยการแก้ไขจะสามารถปรับปรุงเป็น10⁻¹⁰ได้)
Jan Hudec

1
@JanHudec ไม่ใช่คนธรรมดาที่สามารถบอกความแตกต่างระหว่างนาฬิกาที่แม่นยำถึง 10 to²หรือ10⁻¹⁰
gerrit

1
เป็นเพียงคำใบ้ว่าทำไม UNIX ถึงไม่รองรับการเพิ่มระดับก้าวกระโดด มีการพูดคุยกันหลายครั้งในการประชุมทางไกลของ Austin Group และผลลัพธ์ก็คือการเพิ่มการสนับสนุนสำหรับเผ่นวินาทีจะทำให้เกิดปัญหามากกว่าการไม่สนับสนุน
schily

12

การปรับค่านาฬิกาถูกควบคุมโดย IERS พวกเขากำหนดการแทรกของเผ่นวินาทีในกระแสเวลาตามที่ต้องการ

จากThe NTP Timescale และ Leap วินาที

บริการระหว่างประเทศโลกหมุน (iers) ที่ปารีสหอสังเกตการณ์ดาราศาสตร์ใช้ให้โดย USNO และหอดูดาวอื่น ๆ เพื่อตรวจสอบ UT1 (นำทาง) ระยะเวลาการแก้ไขสำหรับรูปแบบที่ผิดปกติในการหมุนของโลก

เท่าที่ฉันรู้ 23:59:60 (วินาทีที่สอง) และ 00:00:00 วันรุ่งขึ้นถือว่าเป็นวินาทีเดียวกันในเวลา Unix


8

เวลา UNIX ถูกวัดบนคอมพิวเตอร์ของคุณโดยใช้ UNIX

คำตอบนี้จะคาดหวังให้คุณทราบว่าCoördinated Universal Time (UTC) เวลาสากลอะตอม (TAI) และ SI วินาทีคืออะไร อธิบายได้ดีเกินขอบเขตของ Unix และ Linux Stack Exchange นี่ไม่ใช่การแลกเปลี่ยนทางฟิสิกส์หรือดาราศาสตร์

ฮาร์ดแวร์

คอมพิวเตอร์ของคุณมีออสซิลเลเตอร์หลายตัวที่ขับเคลื่อนนาฬิกาและตัวจับเวลา สิ่งที่แตกต่างจากคอมพิวเตอร์หนึ่งไปอีกเครื่องหนึ่งขึ้นอยู่กับสถาปัตยกรรมของมัน แต่โดยทั่วไปและในแง่ทั่วไปมาก:

  • มีตัวจับเวลาช่วงเวลาที่ตั้งโปรแกรมได้ (PIT) ที่ใดที่หนึ่งซึ่งสามารถตั้งโปรแกรมให้นับจำนวนการแกว่งที่กำหนดและทริกเกอร์การขัดจังหวะหน่วยประมวลผลกลาง
  • มีตัวนับรอบตัวประมวลผลกลางที่นับเพียง 1 สำหรับแต่ละรอบคำสั่งที่เรียกใช้งาน

ทฤษฎีการทำงานในแง่กว้างมาก

ทำให้ระบบปฏิบัติการเคอร์เนลใช้ PIT เพื่อสร้างเห็บ มันตั้งค่า PIT ให้ทำงานโดยอิสระนับจำนวนการแกว่งที่ถูกต้องสำหรับช่วงเวลาหนึ่งร้อยวินาทีสร้างการขัดจังหวะจากนั้นรีเซ็ตการนับอัตโนมัติอีกครั้ง มีการเปลี่ยนแปลงในเรื่องนี้ แต่ในสาระสำคัญนี้ทำให้เกิดการขัดจังหวะเห็บที่จะเพิ่มความถี่คงที่

ในซอฟต์แวร์เคอร์เนลจะเพิ่มตัวนับทุกเครื่องหมาย มันรู้ความถี่ของเห็บเพราะมันตั้งโปรแกรม PIT ตั้งแต่แรก ดังนั้นจึงรู้ว่ากี่เห็บทำขึ้นเป็นวินาที มันสามารถใช้สิ่งนี้เพื่อทราบว่าเมื่อใดที่จะเพิ่มตัวนับที่นับวินาที สิ่งนี้เป็นแนวคิดของเคอร์เนลของ "UNIX Time" ที่จริงแล้วมันก็นับขึ้นในอัตราหนึ่งต่อ SI วินาทีถ้าปล่อยให้อุปกรณ์ของตัวเอง

มีสี่สิ่งที่ทำให้เกิดความยุ่งยากซึ่งฉันจะนำเสนอในแง่ทั่วไป

ฮาร์ดแวร์ไม่สมบูรณ์ PIT ที่แผ่นข้อมูลบอกว่ามีความถี่ออสซิลเลเตอร์ที่Nเฮิรตซ์อาจมีความถี่ (พูด) N .00002 Nเฮิร์ตซโดยมีผลที่ชัดเจน

รูปแบบนี้ทำงานร่วมกันได้ไม่ดีนักกับการจัดการพลังงานเนื่องจาก CPU กำลังตื่นขึ้นหลายร้อยครั้งต่อวินาทีเพื่อเพิ่มจำนวนในตัวแปรเพียงเล็กน้อย ดังนั้นระบบปฏิบัติการบางระบบจึงมีสิ่งที่รู้กันว่าเป็น "การออกแบบที่ไร้ค่า" แทนที่จะทำให้ PIT ส่งสัญญาณขัดจังหวะสำหรับทุก ๆ ติ๊กเคอร์เนลจะทำงานออกมา (จากตัวกำหนดตารางเวลาระดับต่ำ) จำนวน ticks จะไปโดยไม่มีเธรดควอนตัมวิ่งออกมาและโปรแกรม PIT จะนับจำนวน ticks นั้นลงใน ในอนาคตก่อนที่จะออกการขัดจังหวะเห็บ มันรู้ว่ามันจะต้องบันทึกเนื้อเรื่องของN ticks ที่สัญญาณรบกวน tick ถัดไปแทนที่จะเป็น 1 tick

แอพพลิเคชั่นซอฟต์แวร์มีความสามารถในการเปลี่ยนเวลาปัจจุบันของเคอร์เนล มันสามารถก้าวมูลค่าหรือสามารถฆ่าค่า Slewing เกี่ยวข้องกับการปรับจำนวนติ๊กที่ต้องผ่านเพื่อเพิ่มตัวนับวินาที ดังนั้นตัวนับวินาทีไม่จำเป็นต้องนับในอัตราหนึ่งต่อ SI วินาทีอย่างไรก็ตามแม้จะสมมติว่าออสซิลเลเตอร์สมบูรณ์แบบ การเหยียบเกี่ยวข้องกับการเขียนหมายเลขใหม่ในตัวนับวินาทีซึ่งไม่เกิดขึ้นจนกว่าจะถึง 1 SI วินาทีตั้งแต่วินาทีที่ผ่านมา

เมล็ดพันธุ์สมัยใหม่ไม่เพียง แต่นับวินาทีเท่านั้น แต่ยังนับเป็นนาโนวินาทีด้วย แต่มันไร้สาระและมักจะไม่สามารถทำได้หากมีเห็บขัดจังหวะครั้งเดียวต่อนาโนวินาที นี่คือสิ่งที่รอบตัวนับเข้ามาเล่น เคอร์เนลจะจดจำค่าตัวนับรอบในแต่ละวินาที (หรือที่แต่ละเห็บ) และสามารถทำงานได้จากมูลค่าปัจจุบันของตัวนับเมื่อสิ่งที่ต้องการรู้เวลาเป็นนาโนวินาทีจำนวนนาโนวินาทีจะต้องผ่านไปตั้งแต่วินาทีสุดท้าย (หรือ ติ๊ก) แม้ว่าการจัดการพลังงานและความร้อนจะเกิดความเสียหายเนื่องจากความถี่ของวงจรการเรียนการสอนสามารถเปลี่ยนแปลงได้ดังนั้นเมล็ดจึงทำสิ่งต่าง ๆ เช่นพึ่งพาฮาร์ดแวร์เพิ่มเติมเช่น (พูด) High Precision Event Timer (HPET)

ภาษา C และ POSIX

ห้องสมุดมาตรฐานของภาษา C อธิบายเวลาในแง่ของชนิดทึบแสงtime_tชนิดโครงสร้างtmที่มีเขตข้อมูลที่ระบุต่างๆและฟังก์ชั่นห้องสมุดต่างๆเช่นtime(), และmktime()localtime()

โดยย่อ: ภาษา C เองนั้นรับประกันได้ว่าtime_tเป็นหนึ่งในประเภทข้อมูลตัวเลขที่มีอยู่และวิธีที่เชื่อถือได้เพียงวิธีเดียวในการคำนวณความแตกต่างของเวลาคือdifftime()ฟังก์ชัน มันเป็นมาตรฐาน POSIX ที่ให้การค้ำประกันที่เข้มงวดที่time_tเป็นหนึ่งในความเป็นจริงของจำนวนเต็มชนิดและว่ามันนับวินาทีตั้งแต่ยุค นอกจากนี้ยังเป็นมาตรฐาน POSIX ที่ระบุtimespecประเภทโครงสร้าง

time()ฟังก์ชั่นบางครั้งก็อธิบายว่าเป็นสายระบบ ในความเป็นจริงมันไม่ได้เรียกระบบพื้นฐานในหลาย ๆ ระบบเป็นเวลานานในปัจจุบัน บน FreeBSD ตัวอย่างเช่นการเรียกใช้ระบบพื้นฐานคือclock_gettime()ซึ่งมี "นาฬิกา" ต่างๆที่มีอยู่ซึ่งวัดได้ในไม่กี่วินาทีหรือวินาที + นาโนวินาทีในรูปแบบต่างๆ เป็นการเรียกระบบนี้โดยที่แอพพลิเคชั่นซอฟต์แวร์อ่านเวลา UNIX จากเคอร์เนล (การclock_settime()เรียกระบบที่ตรงกันช่วยให้พวกเขาก้าวและการadjtime()เรียกระบบช่วยให้พวกเขาฆ่ามัน)

หลายคนโบกคลื่นมาตรฐาน POSIX ด้วยการเรียกร้องที่ชัดเจนและแน่นอนมากเกี่ยวกับสิ่งที่กำหนดไว้ คนดังกล่าวมีบ่อยกว่าไม่อ่าน POSIX มาตรฐาน ตามที่เหตุผลได้กำหนดไว้ความคิดในการนับ "วินาทีนับตั้งแต่ยุค" ซึ่งเป็นวลีที่ใช้มาตรฐานโดยเจตนาไม่ได้ระบุว่าวินาที POSIX มีความยาวเท่ากับ SI วินาทีหรือว่าผลลัพธ์ของgmtime()"จำเป็น UTC แม้จะมีรูปลักษณ์ของมันก็ตาม " มาตรฐาน POSIX นั้นจงใจหลวมพอที่จะอนุญาตให้ (พูด) ระบบ UNIX ที่ผู้ดูแลระบบไปและแก้ไขการปรับค่าเผ่นวินาทีด้วยตนเองโดยตั้งค่านาฬิกาใหม่ในสัปดาห์หลังจากที่มันเกิดขึ้น แท้จริงแล้วเหตุผลนั้นชี้ให้เห็นว่ามันตั้งใจปล่อยให้มันเพียงพอที่จะรองรับระบบที่มีการตั้งค่านาฬิกาผิดเวลาในบางครั้งนอกเหนือจากเวลา UTC ปัจจุบัน

UTC และ TAI

การตีความ UNIX Time ที่ได้รับจากเคอร์เนลขึ้นอยู่กับรูทีนไลบรารีที่รันในแอ็พพลิเคชัน POSIX ระบุตัวตนในระหว่างช่วงเวลาของเคอร์เนลและ "เสียเวลาลง" struct tmในหนึ่ง แต่ตามที่ Daniel J. Bernstein เคยชี้ให้เห็นว่ามาตรฐานฉบับปี 1997 มีความเป็นตัวตนที่ผิดอย่างน่าละอายทำให้กฎระเบียบปีก้าวกระโดดของปฏิทินเกรโกเรียน (สิ่งที่เด็กนักเรียนเรียนรู้) เพื่อให้การคำนวณนั้นผิดพลาดตั้งแต่ปี 2100 เป็นต้นไป "มีเกียรติมากขึ้นในการฝ่าฝืนมากกว่าการปฏิบัติ" เป็นวลีที่มาพร้อมกับใจ

และแน่นอนมันเป็น หลายระบบในปัจจุบันฐานการตีความนี้เมื่อประจำห้องสมุดที่เขียนโดยอาร์เธอร์เดวิดโอลสันที่ปรึกษาที่น่าอับอาย "ฐานข้อมูลเขตโอลสัน" /usr/share/zoneinfo/มักจะเข้ารหัสในไฟล์ฐานข้อมูลภายใต้ ระบบ Olson มีสองโหมด:

  • เคอร์เนล "วินาทีตั้งแต่ยุค" ถือเป็นนับวินาที UTC ตั้งแต่ 1970-01-01 00:00:00 UTC ยกเว้นวินาทีกระโดด ใช้posix/ชุดของไฟล์ฐานข้อมูลเขตเวลาของ Olson ทุกวันมีเคอร์เนล 86400 วินาทีและไม่เคยมี 61 วินาทีในหนึ่งนาที แต่ก็ไม่ได้มีความยาวของ SI วินาทีเสมอไปและนาฬิกาเคอร์เนลต้องการการแกว่งหรือก้าวเมื่อวินาทีกระโดดเกิดขึ้น
  • เคอร์เนล "วินาทีนับตั้งแต่ยุค" ถือเป็นนับวินาที TAI ตั้งแต่ 1970-01-01 00:00:10 TAI ใช้right/ชุดของไฟล์ฐานข้อมูลเขตเวลาของ Olson Kernel วินาทีมีความยาว 1 SI วินาทีและนาฬิกาเคอร์เนลไม่ต้องการการแกว่งหรือก้าวเพื่อปรับวินาทีสำหรับ leap วินาที แต่เวลาที่แตกสลายอาจมีค่าเช่น 23:59:60 และวันไม่ยาว 86400 วินาทีเคอร์เนล

M. Bernstein เขียนเครื่องมือหลายอย่างรวมถึงdaemontoolsชุดเครื่องมือของเขาที่ต้องการright/เพราะพวกเขาเพียงแค่เพิ่ม 10 ถึงtime_tจะได้รับ TAI วินาทีตั้งแต่ 1970-01-01 00:00:00 TAI เขาบันทึกไว้ในหน้าคู่มือ

ความต้องการนี้ได้ (อาจไม่รู้) สืบทอดโดย toolsets เช่นdaemontools-encoreและrunitและเฟลิกซ์ฟอน libowfatLeitner ใช้Bernsteinmultilog , GuentermultilogหรือPape ที่svlogdมีการposix/กำหนดค่าแบบOlson และไทม์สแต็กของ TAI64N ทั้งหมดจะเป็น (ในขณะที่เขียนนี้) 26 วินาทีหลังการนับ TAI จริงนับตั้งแต่วินาทีที่ 1970-01-01 00:00:10 TAI

Laurent Bercot และฉันพูดถึงเรื่องนี้ใน s6 และ nosh แม้ว่าเราจะใช้วิธีการที่แตกต่างกัน M. Bercot tai_from_sysclock()อาศัยธงเวลารวบรวม เครื่องมือ nosh ที่จัดการใน TAI64N ดูที่TZและTZDIRตัวแปรสภาพแวดล้อมเพื่อตรวจจับอัตโนมัติposix/และright/หากทำได้

ที่น่าสนใจคือเอกสาร FreeBSD time2posix()และposix2time()ฟังก์ชั่นที่อนุญาตให้เทียบเท่ากับright/โหมดOlson ด้วยtime_tTAI วินาที ดูเหมือนว่าจะไม่เปิดใช้งานอย่างไรก็ตาม

อีกครั้ง ...

เวลา UNIX ถูกวัดบนคอมพิวเตอร์ของคุณที่รัน UNIX โดย oscillators ที่อยู่ในฮาร์ดแวร์ของคอมพิวเตอร์ของคุณ ไม่ใช้ SI วินาที มันไม่ได้เป็น UTC แม้ว่ามันอาจจะดูคล้าย ๆ เผินๆก็ตาม และจงใจอนุญาตให้นาฬิกาของคุณผิด

อ่านเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.