UNIX ให้เก็บเวลาเป็นจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 และนั่นหมายความว่า Linux ก็เช่นกัน เราอธิบายระบบที่แปลกประหลาดนี้ดูเหมือนว่าทำไมวันโลกาวินาศจึงถูกกำหนดไว้สำหรับปี 2038
evix แรกแรก
goethe ( 1749-1832 ) ประกาศ "ทุกวินาทีเป็นค่าที่ไม่มีที่สิ้นสุด" นั่นเป็นเรื่องจริงเราแต่ละคนมีเพียงไม่กี่วินาทีที่นี่บนโลกโลกและเราไม่รู้ว่าเมื่อวินาทีสุดท้ายของเราจะเป็น แต่เรารู้วันเกิดของเราและเมื่อการนับถอยหลังของมนุษย์ของเราเริ่มต้นขึ้น
unix -ชอบ ราชินีอังกฤษ - มีวันเกิดสองวัน หรือแม่นยำยิ่งขึ้นมีสองครั้งที่แยกจากกันซึ่งมันเริ่มนับเป็นวินาทีของการดำรงอยู่ของมัน ครั้งแรกที่ UNIX เริ่มนับจากคือเที่ยงคืน ม.ค. 1971
เราสามารถเห็นสิ่งนี้ได้ค่อนข้างชัดเจนโดยการตรวจสอบส่วนของรุ่นแรกของ
คู่มือโปรแกรมเมอร์ Unix
, ลงวันที่ 3 พฤศจิกายน 1971 เลื่อนลงไปที่หน้า 13 ของส่วนนั้นและคุณจะเห็นคำอธิบายของ (ตอนนี้หมดอายุ)
เวลา
สั่งการ. เราบอกว่า "
เวลา
ส่งคืนเวลาตั้งแต่ 00:00:00, 1 ม.ค. 1971 วัดในหกสิบวินาที "
ปฏิทินและระบบเวลาที่วัดเวลาเริ่มต้นที่จุดสำคัญในอดีตเช่นเหตุการณ์จักรวาลวิทยาผู้ก่อตั้งจักรวรรดิหรือความสำเร็จของการปฏิวัติ ในระบบปฏิบัติการเวลาและวันที่ตามอำเภอใจได้รับการคัดเลือกเป็นจุดที่การนับเริ่มต้น นี้เป็น ยุค สำหรับระบบปฏิบัติการนั้น
UNIX ใช้จำนวนเต็มที่ไม่ได้ลงชื่อ 32 บิตเพื่อเก็บนับ 60 วินาทีวินาทีตั้งแต่ยุคสมัย นี่เป็นตัวแปรตัวเลขที่มีความสามารถในการถือค่าในช่วง 0 ถึง 4,294,967,295 (2) 32 -1) ฟังดูเหมือนเป็นจำนวนมาก แต่เคาน์เตอร์เพิ่มขึ้น 60 เท่าต่อวินาทีและในฐานะผู้เขียนโปรแกรมโปรแกรมเมอร์ชี้ให้เห็นว่า "ผู้ใช้ที่มีความคิดตามลำดับเวลาจะทราบว่า 2 ** 32 Sixtieths ของวินาทีเพียงประมาณ 2.5 ปี"
ด้วยอัตราการบริโภค 60 จำนวนต่อวินาทีเคาน์เตอร์จะได้รับค่าสูงสุดในวันที่ 8 เมษายน 1973 น้อยกว่า 829 วันต่อมา
evix ที่สอง
ไม่จำเป็นต้องพูดเรื่องนี้ทำหน้าที่อย่างรวดเร็ว จำนวนเต็มที่ไม่ได้ลงชื่อถูกแทนที่ด้วย 32- บิต ที่ลงชื่อ จำนวนเต็ม. อาจดูเป็นตัวเลือกที่น่าแปลกใจเพราะจำนวนเต็มที่ลงชื่อสามารถถือค่าบวกจำนวนน้อย -2,147,483,647 (2) 31 ) - จำนวนเต็มที่ไม่ได้ลงชื่อ อย่างไรก็ตามความเร็วในการบริโภคก็ลดลงจาก 60 ของวินาทีเป็นวินาทีทั้งหมด
ใช้เวลานานกว่าที่จะนับจาก 0 ถึง 2,147,483,647 การนับหนึ่งหมายเลขต่อวินาทีกว่าที่จะนับตั้งแต่ 0 ถึง 4,294,967,295 ที่ 60 จำนวนต่อวินาที และโดยค่อนข้างมาถึง รูปแบบใหม่จะไม่ได้รับค่าสูงสุดเพียง 68 ปี ดูเหมือนว่าในอนาคตจะอยู่ในอนาคตที่ยุคนั้นถูกรีเซ็ตเป็นจุดก่อนหน้าในเวลา ยุคใหม่ถูกตั้งค่าเป็นเที่ยงคืนในวันที่ 1 มกราคม 1970, UTC
จุดที่ 68 ปีในอนาคตใกล้ชิดอย่างไม่น่าสนใจ ที่จะแม่นยำเราจะไปถึงที่ 03:14:07 UTC เมื่อวันที่ 19 มกราคม 2038
โครงการที่เรียบง่าย แต่มีประสิทธิภาพ
การใช้จำนวนเต็มเดียวเพื่อนับจำนวนขั้นตอนเวลาจากจุดที่กำหนดในเวลาเป็นวิธีที่มีประสิทธิภาพในการจัดเก็บเวลา คุณไม่จำเป็นต้องเก็บโครงสร้างที่ซับซ้อนของปีเดือนวันและเวลา และเป็นประเทศโลแคลและเขตเวลาที่เป็นอิสระ
การคูณตัวเลขในจำนวนเต็มตามขนาดของขั้นตอนในกรณีนี้หนึ่งวินาที - ให้เวลาคุณตั้งแต่ยุคสมัยและการแปลงจากรูปแบบเฉพาะตำแหน่งที่มีการปรับโซนเวลาค่อนข้างเล็กน้อย
มันให้ขีด จำกัด บนในตัวคุณ ไม่ช้าก็เร็วคุณจะได้รับค่าสูงสุดที่คุณสามารถเก็บไว้ในประเภทตัวแปรที่คุณเลือก ในช่วงเวลาของการเขียนบทความนี้ปี 2038 อยู่ห่างออกไปเพียง 17 ปี
มันคล้ายกัน แต่แตกต่างกันเล็กน้อยกับปัญหากับระบบคอมพิวเตอร์ในช่วงต้นของศตวรรษที่ผ่านมาโดยใช้สองหลักในการจัดเก็บปี เมื่อปฏิทินกลิ้งไปในปีใหม่และศตวรรษใหม่ของปี 2000 มูลค่าปีที่เก็บไว้เป็น "00" ถูกตีความว่าเป็น 2000 หรือ 1900?
แก้ไขสิ่งที่เรียกว่า " แมงมุม "คาดว่าจะมีค่าใช้จ่ายของสหรัฐฯคนเดียวมากกว่า $ 100 พันล้านและต้องใช้เวลาหลายพันปีในการจัดการทั่วโลก มีปัญหาบางอย่างในช่วงสองสามวันแรกของเดือนมกราคม 2000 แต่ไม่มีอะไรที่เหมือนกับภัยพิบัติที่จะเกิดขึ้นหากข้อผิดพลาดถูกเพิกเฉย
วันโลกาวินาศถูกเลื่อนออกไป
เนื่องจาก Linux และระบบปฏิบัติการ Unix-Lookalike ทั้งหมดแบ่งปันปัญหาเดียวกันปัญหาปี 2038 ได้รับการดำเนินการอย่างจริงจังในบางครั้งด้วยการแก้ไขที่ถูกเพิ่มเข้าไปในเคอร์เนลตั้งแต่ปี 2014 สิ่งนี้ยังคงดำเนินต่อไปพร้อมกับการแก้ไข ถูกเพิ่มไปยังเคอร์เนล เมื่อเร็ว ๆ นี้เป็น 2020 ม.ค. เพื่อแก้ไขปัญหาจำนวนเต็ม 32 บิต
แน่นอนว่าคอมพิวเตอร์ Linux ที่ใช้งานได้มีมากกว่าเคอร์เนล ยูทิลิตี้การดำเนินงานและแอปพลิเคชัน Userland ทั้งหมดที่ใช้เวลาระบบผ่าน API และอินเทอร์เฟซต่าง ๆ จะต้องมีการแก้ไขเพื่อคาดหวังค่า 64 บิต ระบบไฟล์เกินไป จะต้องอัปเดต เพื่อยอมรับการประทับเวลา 64- บิตสำหรับไฟล์และไดเรกทอรี
ลินุกซ์อยู่ทุกที่ . ความล้มเหลวในการเกิดภัยพิบัติใน Linux หมายถึงความล้มเหลวในทุกระบบที่ใช้คอมพิวเตอร์ทุกประเภท ลินุกซ์ทำงานส่วนใหญ่ของเว็บคลาวด์สาธารณะส่วนใหญ่และแม้แต่ยานอวกาศ มันรันบ้านสมาร์ทและรถยนต์ขับรถด้วยตนเอง สมาร์ทโฟนมีเคอร์เนลที่ได้รับจาก Unix ที่หัวใจของพวกเขา ไฟร์วอลล์เครือข่ายใดที่เหมือนกับเครือข่ายเราเตอร์และโมเด็มบรอดแบนด์ที่มีระบบปฏิบัติการที่ฝังอยู่ภายใน Linux
มันยอดเยี่ยมมากที่ Linux นั้นเป็นวิธีที่จะได้รับการแก้ไข เราจะติดตั้งการอัพเกรดและนั่นจะเป็นเช่นนั้น แต่โอกาสที่อุปกรณ์เหล่านั้นจะถูกแก้ไขและอัปเดตอะไรบ้าง พวกเขาจำนวนมากจะไม่ให้บริการด้วยเช่นนั้นดังนั้นมันจะเป็นจุดที่สงสัย แต่บางคนยังคงมีเสียบปลั๊กออกไป ซ่อนตัวอยู่ในที่มืดและฝุ่นละอองในห้องเซิร์ฟเวอร์และตู้แร็คบางที แต่พวกเขาจะอยู่ที่นั่นทำงานอย่างเงียบ ๆ ในขณะที่วินาทีติ๊กจนกระทั่งประมาณหนึ่งในสี่ในช่วงเช้าของวันที่ 19 มกราคม 2038
แต่อุปกรณ์เช่นนั้นควรเป็นชนกลุ่มน้อย ระบบส่วนใหญ่จะเห็นเวลากระทืบมาและไปโดยไม่มีเหตุการณ์ อีกครั้งเราจะสามารถผ่อนคลาย อย่างน้อยจนกระทั่งปี 2486 เข้าใกล้นำมาด้วยปัญหาที่แน่นอนสำหรับระบบที่ใช้จำนวนเต็มที่ใช้ 64 บิตเพื่อนับเวลาตั้งแต่ยุคสมัย
คำสั่งวันที่
เราทำได้
ใช้
วันที่
สั่งการ
ในการตรวจสอบ Linux และอนุพันธ์ของ UNIX อื่น ๆ ยังคงใช้รูปแบบดั้งเดิมที่เรียบง่ายในการจัดเก็บค่าเวลาเป็นจำนวนวินาทีตั้งแต่ยุค
ใช้
วันที่
คำสั่งที่ไม่มีพารามิเตอร์ใด ๆ พิมพ์วันที่และเวลาปัจจุบันไปยังหน้าต่างเทอร์มินัล คุณยังแสดงโซนเวลาที่ปรับเวลาให้ EDT เป็นเวลากลางวันตะวันออกซึ่งหมายความว่าคอมพิวเตอร์ทดสอบของเราอยู่ในเขตเวลาตะวันออกและ
ออมแสงตามฤดูกาล
มีผลบังคับใช้ เมื่อเวลาออมแสงตามฤดูกาลไม่มีผลบังคับใช้โซนเวลาตะวันออกใช้เวลามาตรฐานตะวันออก
หากต้องการดูค่าจำนวนเต็มพื้นฐานเราสามารถใช้สตริงรูปแบบการแสดงผล สตริงรูปแบบมีเครื่องหมายบวก "+" เป็นอักขระตัวแรกของพวกเขา โทเค็นรูปแบบ "% s" หมายถึง "แสดงวินาทีตั้งแต่ยุค"
หากเราใช้เวลาวินาทีที่ส่งคืนโดย
วันที่
และเลี้ยงมันกลับเข้าไปใน
วันที่
คำสั่ง
-NS
ตัวเลือก (แสดงเวลาที่อธิบายโดยสตริง) มันจะแปลงกลับเป็นวันที่และเวลาปกติ
วันที่
วันที่ +% S
วันที่ -d @ 1633183955
เราสามารถแสดงให้เห็นว่าค่าจำนวนเต็มแสดงให้เห็นถึงเวลาโดยการแสดงจำนวนวินาทีนอนหลับเป็นเวลา 10 วินาทีและแสดงจำนวนวินาทีใหม่ ค่าจำนวนเต็มทั้งสองจะแตกต่างกันโดย 10
วันที่ +% S & AMP; & amp; นอนหลับ 10 และแอมป์; & amp; วันที่ +% S
เราได้เห็นว่าเราสามารถผ่านจำนวนวินาทีถึง
วันที่
คำสั่งและแปลงเป็นเวลาและวันที่สำหรับเรา หากเราทำเช่นนั้นโดยใช้ศูนย์วินาทีเป็นอินพุตค่าของเรา
วันที่
ควรพิมพ์วันที่และเวลาของ unix epoch
tz = 'UTC' วันที่ -d @ 0 + '% x% r'
คำสั่งแบ่งตามนี้:
-
TZ = 'UTC'
: EPOCH ถูกกำหนดโดยใช้เวลาสากลที่ประสานงาน (UTC ดังนั้นเราต้องบอก
วันที่เพื่อใช้ UTC โครงสร้าง "TZ =" ตั้งค่าโซนเวลาที่มีประสิทธิภาพสำหรับคำสั่งปัจจุบันเท่านั้น -
วันที่
: NS
วันที่สั่งการ. -
-NS
@ 0
: เราบอก
วันที่ในการใช้สตริงเป็นอินพุตไม่ใช่เวลา "ตอนนี้" สตริงที่เราส่งผ่านเป็นศูนย์วินาที -
+ '% x% r'
: สตริงรูปแบบเอาต์พุต โทเค็นรูปแบบ "% x" บอก
วันที่เพื่อแสดงปีเดือนและวัน โทเค็นรูปแบบ "% r" สั่งสอนวันที่ในการใช้รูปแบบ 24 ชั่วโมงสำหรับชั่วโมงและนาที เนื่องจากมีช่องว่างในสตริงรูปแบบเราจึงห่อสตริงทั้งหมดในเครื่องหมายคำพูดเดียว "'"ดังนั้นสตริงที่ถือว่าเป็นรายการเดียว
ตามที่คาดไว้ผลผลิตคือเที่ยงคืนในวันที่ 1 มกราคม 1970
ที่เกี่ยวข้อง: วิธีการแสดงวันที่และเวลาในเทอร์มินัล Linux (และใช้ในสคริปต์ Bash)
จนกว่าจะถึงครั้งต่อไป
ง่าย ๆ มักจะดีที่สุด การนับวินาทีจาก Datum คงที่เป็นวิธีที่ง่ายที่สุดในการทำเครื่องหมายเวลาที่ผ่านไป แต่กาลเวลานำความท้าทายใหม่มาใช้ ด้วยการแก้ไขที่วางไว้ดูเหมือนว่าเราชัดเจนถึงปี 2486
ฉันคิดว่าปลอดภัยที่จะบอกว่าเราจะกังวลเกี่ยวกับเรื่องนี้ใกล้เคียงกับเวลาเล็กน้อย