เวลา Unix และการเขียนแบบ ISO 8601
หน่วยนอกระบบ SI · ปริมาณ: ขณะเวลาในรูปจำนวนเต็มวินาทีนับแต่ปี 1970
วันที่ 19 มกราคม 2038 เวลาสามนาฬิกาสิบสี่นาทีเจ็ดวินาทีตามเวลาสากล ตัวนับวินาทีความกว้างสามสิบสองบิตจะไปถึง 2 147 483 647 — จำนวนมากที่สุดที่มันบรรจุไหว จังหวะถัดไปจะยกบิตสูงสุดขึ้น และคำฐานสองคำเดียวกันนั้นก็จะถูกอ่านเป็นจำนวนลบ นาฬิกาที่เก็บเวลาด้วยการนับแบบนี้เองจะไปอยู่ ไม่ใช่ในปี 2038 แต่ในเดือนธันวาคม 1901 และนี่ไม่ใช่เรื่องแปลกของอนาคตอันไกล — ตัวควบคุมทางอุตสาหกรรมหรือมาตรวัดน้ำนั้นใช้งานได้นานกว่าสิบสองปีที่เหลืออยู่
การนับนี้สร้างขึ้นอย่างเรียบง่ายที่สุด วินาทีไหลต่อเนื่องกันไปนับแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 และหนึ่งวันในนั้นบรรจุ 86 400 วินาทีพอดีเสมอ ความเรียบง่ายนี้เองเป็นบ่อเกิดของลักษณะพิเศษทั้งสองประการ ด้านหนึ่ง จากตัวเลขย่อมได้วันที่ตามปฏิทินทันที และในทางกลับกันด้วย ฉะนั้นบันทึกเหตุการณ์ทุกฉบับ ฐานข้อมูลทุกแห่ง และระบบแฟ้มทุกระบบจึงเก็บเวลาด้วยสิ่งนี้ อีกด้านหนึ่ง อธิกวินาทีนั้นแสดงในการนับเช่นนี้ไม่ได้เลย กล่าวคือ ตรงข้ามกับชื่อของมัน สิ่งที่มันให้เลขลำดับไม่ใช่วินาที หากเป็นวันพร้อมเศษส่วน และแท้จริงแล้วมันคือฟังก์ชันเชิงเส้นของการเขียนแบบ UTC มิใช่ตัวนับเวลาที่ผ่านไป
01 · นิยาม
เวลา Unix คือจำนวนวินาทีที่ผ่านไปนับแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 ตามเวลาสากลเชิงพิกัด โดยถือว่าแต่ละวันบรรจุ 86 400 วินาทีพอดี การเขียนแบบ ISO 8601 กล่าวสิ่งเดียวกันด้วยวิธีอื่น คือด้วยวันที่ตามปฏิทิน เวลาของวัน และการระบุค่าเหลื่อมจากเส้นเมริเดียนแรก โดยช่องต่าง ๆ เรียงจากหยาบไปหาละเอียดอย่างเคร่งครัด
ข้อสงวนเรื่อง 86 400 วินาทีนั้นมิใช่เรื่องเล็ก หากเป็นสาระสำคัญที่สุดในนิยาม อธิกวินาทีซึ่งหน่วยงานดูแลการหมุนของโลกประกาศนั้น การนับรับไว้ไม่ได้ ด้วยเหตุนี้ ณ ขณะที่แทรก ระบบจึงทำซ้ำค่าเดียวกันสองครั้ง หรือไม่ก็หมุนนาฬิกากลับ จากตรงนี้ได้ข้อสำคัญมาว่า ผลต่างของจำนวน unix สองค่ามิใช่จำนวนวินาทีที่ผ่านไปจริงระหว่างสองเหตุการณ์ หากมีการแทรกตกอยู่ระหว่างนั้น — ความคลาดจากมาตราเชิงอะตอมสะสมมาถึงยี่สิบเจ็ดวินาทีแล้ว
ส่วนขีดจำกัดนั้นไม่ขึ้นกับนิยาม หากขึ้นกับความกว้างของการเก็บ สามสิบสองบิตพร้อมเครื่องหมายให้ค่ามากที่สุด 2 147 483 647 ซึ่งตกในวันที่ 19 มกราคม 2038 การเพิ่มครั้งถัดไปทำให้บิตสูงสุดเป็นหนึ่งและทำให้จำนวนกลายเป็นลบ เหวี่ยงนาฬิกากลับไปยังวันที่ 13 ธันวาคม 1901 หกสิบสี่บิตผลักเส้นแบ่งไปข้างหน้าสองแสนเก้าหมื่นสองพันล้านปี ทว่านาโนวินาทีจำนวนเต็มในหกสิบสี่บิตเดียวกันนั้นกลับหมดลงตั้งแต่ปี 2262
การเขียนตามมาตรฐานแก้โจทย์อีกอย่างหนึ่ง คือการแลกเปลี่ยน มิใช่การเก็บ ด้วยเหตุนี้ในนั้นจึงมีน้ำหนักกับสิ่งที่ตัวเลขไม่มีเลย ได้แก่ ค่าเหลื่อมเป็นชั่วโมง ตัวคั่นระหว่างวันที่กับเวลา และกฎที่ว่าเมื่อสายอักขระยาวเท่ากัน ลำดับตามพจนานุกรมย่อมตรงกับลำดับตามเวลา คุณสมบัติข้อหลังนี้เองที่ทำให้รูปแบบดังกล่าวกลายเป็นรากฐานของการเรียงลำดับในชื่อแฟ้มและในบันทึก
โปรดเลื่อนเวลาด้วยแถบเลื่อน แล้วดูว่าเรจิสเตอร์เต็มขึ้นอย่างไร บิตต่าง ๆ สว่างจากขวาไปซ้าย และตราบใดที่บิตสูงสุดซึ่งเป็นบิตเครื่องหมายยังมืดอยู่ จำนวนก็ยังเป็นบวกและวันที่ก็เพิ่มขึ้น ทันทีที่ตัวนับก้าวพ้น 2 147 483 647 บิตสูงสุดจะลุกเป็นสีแดง จำนวนทั้งหมดกลายเป็นลบ และนาฬิกากระโดดไปยังปี 1901
เส้นตรงสีเขียวคือมาตราเชิงอะตอม ซึ่งทุกวินาทีเป็นวินาทีจริง ๆ เส้นขั้นบันไดสีแดงคือเวลา Unix ซึ่งทุกครั้งที่มีการแทรกจะให้ตราเวลาเดียวกันออกมาสองหน ทำให้เส้นหยุดนิ่งอยู่กับที่ ความคลาดขณะนี้อยู่ที่ยี่สิบเจ็ดวินาทีและยังเพิ่มขึ้น ด้วยเหตุนี้การนับจึงใช้ได้กับวันที่ตามปฏิทิน แต่ใช้วัดช่วงเวลาในทางฟิสิกส์ไม่ได้
02 · การแปลงหน่วย
โปรดใส่ตราเวลาหรือวันที่
ระหว่างพหุคูณทั้งหมดของการนับ — วินาที มิลลิวินาที ไมโครวินาที และนาโนวินาที — การแปลงนั้นแม่นยำ เพราะต่างกันเพียงตัวคูณเดียว ที่เป็นค่าประมาณมีเพียงบรรทัดเดียว คือการแปลงไปยังมาตราเชิงอะตอม ซึ่งต้องรู้ว่าจนถึงขณะที่กำหนดนั้นมีอธิกวินาทีสะสมอยู่เท่าใด
การแยกสายอักขระตามมาตรฐานนั้น แผ่นนี้ทำในการเขียนแบบขยายที่มีอักษร Z ส่วนรูปพื้นฐานที่ไม่มีตัวคั่นถูกย้ายไปไว้ในการตั้งค่าละเอียด
ปัญหาปี 2038 มิได้อยู่ที่มาตรฐาน หากอยู่ที่ตัวเครื่องและรหัสเก่า ตราเวลาขนาดสามสิบสองบิตฝังอยู่ในโปรแกรมภายในของมาตรวัด ในตัวควบคุมทางอุตสาหกรรม ในรูปแบบของระบบแฟ้ม และในฐานข้อมูลที่ประกาศช่องไว้เป็นสี่ไบต์แล้ว การเปลี่ยนชนิดในต้นฉบับนั้นง่ายพอ ทว่าการไล่ตรวจอุปกรณ์ที่ติดตั้งแล้วนับล้านเครื่องภายในสิบสองปีที่เหลือ เป็นงานชนิดเดียวกับที่เคยรออยู่ก่อนปี 2000
| ค่า | หมายเหตุ | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · อันดับของขนาด
มาตราลอการิทึม: จากหนึ่งวินาทีถึงขีดจำกัดของหกสิบสี่บิต04 · เครื่องมือวัด
ใช้สิ่งใดประทับตราเวลาแก่เหตุการณ์
ชิปอีกตัวหนึ่งพร้อมแบตเตอรี่ ซึ่งเดินการนับต่อไปขณะที่เครื่องปิดอยู่ โดยทั่วไปมันมิได้เก็บตราเวลา unix หากเก็บช่องต่าง ๆ ของปฏิทินแยกกัน และความกว้างของช่องปีก็เป็นของมันเอง ดังนั้นบนแผงวงจรเก่า การพูดถึงปี 2038 จึงมักเริ่มจากคำถามที่ว่า ตัวชิปเองนับได้ถึงปีใด
เกณฑ์วิธี NTP นำนาฬิกาของเครื่องมาสู่เวลาร่วมด้วยความละเอียดระดับไม่กี่มิลลิวินาที และตัวมันเองก็เตือนถึงการแทรกด้วยธงเฉพาะล่วงหน้าหนึ่งวัน มันเองก็มีเส้นแบ่งของตน และเส้นนั้นมาถึงก่อน การนับเดินจากปี 1900 ในสามสิบสองบิตไม่มีเครื่องหมาย และจะล้นในเดือนกุมภาพันธ์ 2036
ในบันทึกนั้น ตราเวลาเขียนได้ทั้งเป็นตัวเลขและเป็นสายอักขระตามมาตรฐาน อย่างหลังดีกว่าด้วยเหตุผลเพียงข้อเดียว คือในสายอักขระที่ยาวเท่ากัน ลำดับตามตัวอักษรย่อมตรงกับลำดับตามเวลา รายการต่าง ๆ จึงเรียงได้โดยไม่ต้องแยกวันที่ ด้วยเหตุนี้เองรูปแบบดังกล่าวจึงแพร่ไปไกลพ้นวงการเทคนิคการคำนวณ
ความพร้อมของอุปกรณ์ต่อปี 2038 นั้นทดสอบได้ทางเดียวเท่านั้น คือตั้งนาฬิกาของมันให้พ้นเส้นแบ่งอันเป็นลางร้ายนั้นไป แล้วดูว่าบันทึก ใบรับรอง และการคำนวณช่วงเวลาจะเป็นอย่างไร ด้วยวิธีนี้ได้พบความล้มเหลวมาแล้วในการคิดค่าบริการ ในระบบควบคุมการเข้าออก และในอายุการใช้ได้ของกุญแจ ซึ่งวันที่ในอนาคตเกิดจากการบวก และล้นเสียก่อนถึงเส้นแบ่งนั้นนานทีเดียว
05 · กฎการเขียน
จากหยาบไปหาละเอียด และมีค่าเหลื่อมเสมอ
มาตรฐานกำหนดให้ช่องเรียงตามลำดับลดหลั่น ให้ปีมีสี่หลัก ให้ใช้ยัติภังค์เป็นตัวคั่นวันที่ และให้มีอักษร T นำหน้าเวลา ส่วนค่าเหลื่อมเป็นชั่วโมงนั้นระบุด้วยอักษร Z สำหรับเส้นเมริเดียนแรก หรือระบุเป็นบวกลบชั่วโมงและนาที ตราเวลา unix เขียนเป็นจำนวนเต็มโดยไม่คั่นหลัก และต้องระบุพหุคูณเสมอ เพราะตัวคูณหนึ่งพันเป็นสิ่งที่แยกวินาทีออกจากมิลลิวินาที ทว่าดูจากขนาดของตัวเลขแล้วสองสิ่งนี้สับสนกันได้ง่าย
การเขียนแบบแรกอ่านต่างกันไปในแต่ละประเทศ จึงใช้ในการแลกเปลี่ยนข้อมูลไม่ได้ แบบที่สองละทั้งตัวคั่นและค่าเหลื่อม ขณะเวลาจึงไม่แน่นอนไปข้างละหนึ่งวัน แบบที่สามเสียเลขศูนย์นำหน้าไป สายอักขระจึงเลิกเรียงตามตัวอักษร ทั้งที่รูปแบบนี้เป็นที่นับถือก็เพราะคุณสมบัติข้อนั้นเอง แบบที่สี่วางเครื่องหมายเท่ากับระหว่างการนับ unix กับมาตราเชิงอะตอม ทั้งที่ระหว่างทั้งสองมีอธิกวินาทีสะสมอยู่ยี่สิบเจ็ดวินาที
06 · หน่วยข้างเคียง
ข้าง ๆ กันนั้นตั้งอยู่ทุกการนับที่สร้างตามหลักเดียวกัน เพียงแต่เริ่มจากจุดอื่น คือเวลา NTP นับแต่ปี 1900 วันจูเลียนนับแต่เที่ยงวันของปี 4713 ก่อนศักราชของเรา และมาตราของระบบดาวเทียมนับแต่เดือนมกราคม 1980 ทั้งหมดต่างกันเพียงศักราชกับหน่วย จึงแปลงกันได้ด้วยการลบค่าคงตัวออก
วินาทีมีเครื่องหมาย
ขีดจำกัดของมันตกในปี 2036 แล้ว
นับอธิกวินาทีอย่างซื่อตรง
ใน แผ่นข้อมูลของ Simetrium ที่อยู่ข้างกันคือ วันจูเลียน, อันเป็นที่มาของค่าคงตัวสำหรับการแปลง, มาตรา UTC, TAI และ UT1, ซึ่งอธิบายอธิกวินาทีที่หายไป, วินาที ในฐานะหน่วยของการนับ และ บิต, ซึ่งความกว้างของมันเองเป็นตัวกำหนดขีดจำกัด
07 · ภาคประวัติ
ศักราชที่เลือกเพราะบิตไม่พอ
ในคู่มือ Unix ฉบับแรกนั้น เวลานับเป็นเศษหนึ่งส่วนหกสิบของวินาทีตั้งแต่ต้นปี 1971 และในสามสิบสองบิต การนับเช่นนั้นบรรจุได้เพียงราวสองปี มันหมดเร็วเสียจนต้องย้ายศักราชทุกครั้งที่ออกระบบรุ่นใหม่ จึงเลิกใช้เศษของวินาทีแล้วหันมาใช้วินาทีจำนวนเต็มแทน
เมื่อเปลี่ยนมาใช้วินาทีจำนวนเต็ม ผู้พัฒนาได้ส่วนเผื่อหนึ่งร้อยสามสิบหกปี และเลือกจุดตั้งต้นตามความสะดวกได้ มิใช่ตามความจำเป็น ที่เลือกคือวันที่ 1 มกราคม 1970 — วันที่ถ้วนที่ใกล้ที่สุดในอดีต ซึ่งบันทึกของเครื่องก็ไปไม่ถึงอยู่แล้ว — และนับแต่นั้นก็ไม่เคยเปลี่ยนอีกเลยแม้สักครั้ง ทั้งที่ระบบเองถูกเขียนใหม่จากรากฐานมาแล้วหลายหน
องค์การระหว่างประเทศว่าด้วยการมาตรฐานได้รวบรวมรูปแบบประจำชาติที่แตกต่างกันไปให้เป็นหนึ่งเดียว และวางกฎง่าย ๆ ไว้เป็นรากฐาน คือช่องต่าง ๆ เรียงจากหยาบไปหาละเอียด ทั้งหมดมีเลขศูนย์นำหน้า ผลพลอยได้กลับสำคัญยิ่งกว่าเจตนาเดิม — สายอักขระเช่นนั้นเรียงได้เหมือนตัวเลข รูปแบบดังกล่าวจึงแพร่เข้าไปในชื่อแฟ้ม ในบันทึก และในเกณฑ์วิธีสำหรับการแลกเปลี่ยน
ระบบตั้งโต๊ะและระบบแม่ข่ายย้ายไปใช้หกสิบสี่บิตนานแล้ว และที่นั่นเส้นแบ่งถูกผลักพ้นขอบฟ้าอันสมเหตุสมผลใด ๆ ไปแล้ว อันตรายยังคงอยู่ที่อื่น คือในโปรแกรมภายในของเครื่องมือที่มีอายุใช้งานยี่สิบปี ในรูปแบบแฟ้มที่ประกาศช่องไว้เป็นสี่ไบต์ และในการคำนวณกำหนดเวลาในอนาคต ซึ่งล้นได้ตั้งแต่วันนี้เพียงบวกสิบห้าปีเข้ากับวันที่ปัจจุบัน
การนับที่ตรงข้ามกับชื่อ กลับไม่ได้นับวินาที
นิยามของเวลา Unix ฟังดูเหมือนเป็นการนับวินาที ทว่าข้อกำหนดที่ว่าวันหนึ่งต้องมี 86 400 วินาทีถ้วนนั้นทำให้มันกลายเป็นสิ่งอื่น คือฟังก์ชันเชิงเส้นของการเขียนแบบ UTC มิใช่มาตรวัดเวลาที่ผ่านไป ทุกครั้งที่หน่วยงานดูแลการหมุนของโลกประกาศการแทรก การนับจำต้องทำซ้ำค่าเดียวกันสองครั้ง หรือไม่ก็กระโดดถอยหลัง และผลต่างของตราเวลาสองค่าก็สูญวินาทีนั้นไปพอดี ตลอดครึ่งศตวรรษ ความสูญเสียเช่นนี้สะสมมาแล้วยี่สิบเจ็ดครั้ง ด้วยเหตุนี้ในงานที่ต้องการช่วงเวลาที่แท้จริง จึงใช้มาตราเชิงอะตอม มิใช่มาตรานี้
ลักษณะพิเศษข้อที่สองมิได้อยู่ในนิยามเลย หากอยู่ในวิธีการเก็บ และนั่นเองทำให้มันเป็นขีดจำกัดเดียวในสารบบของเราที่มิได้กำหนดโดยธรรมชาติหรือโดยข้อตกลง หากกำหนดโดยความกว้างของคำในเครื่อง วันจูเลียนไม่มีวันสิ้นสุด เพราะมันเป็นตัวเลข ส่วนเวลา Unix สิ้นสุดในวันที่ 19 มกราคม 2038 เพราะมันเป็นช่องขนาดสี่ไบต์ ความต่างระหว่างปริมาณกับการแทนปริมาณนั้นตามปกติมิใคร่กวนใจนักมาตรวิทยา ทว่า ณ ที่นี้ มันเองนั่นแหละที่ชี้ขาดทุกอย่าง
สารบัญ · หน่วยวัด
แผ่นข้อมูลสำหรับทุกปริมาณ
หน่วยฐานของ SI เจ็ดหน่วย หน่วยอนุพัทธ์ที่มีชื่อของตนเองยี่สิบสองหน่วย และปริมาณนอกระบบซึ่งขาดไปแล้วทั้งงานช่างและปฏิทินก็ไม่เดิน