ปัญหาปี ค.ศ. 2038

ปัญหาปี ค.ศ. 2038 () เป็นปัญหาในการเก็บข้อมูลของคอมพิวเตอร์ที่เก็บเวลาในรูปแบบของจำนวนเต็มบิต 32 บิต โดยคอมพิวเตอร์รูปแบบนี้เก็บวันที่ตั้งแต่ 00:00:00 นาฬิกา ของวันที่ 1 มกราคม ค.ศ. 1970 ตามเวลาสากลเชิงพิกัด (เรียกเวลานี้ว่า ต้นยุคอ้างอิง) ทำให้คอมพิวเตอร์รูปแบบนี้ไม่สามารถถอดรหัสเวลาได้หลังจาก 03:14:07 นาฬิกา ของวันที่ 19 มกราคม ค.ศ. 2038 ซึ่งปัญหานี้คล้ายกับ ปัญหาปี ค.ศ. 2000 แต่ไม่ได้คล้ายกันในแง่ของการเก็บข้อมูล ซึ่งในกรณีนั้นเป็นการเก็บจำนวนเต็มของปี ค.ศ. ซึ่งเก็บด้วยจำนวนเต็ม 2 หลัก ทำให้เกิดความสับสนขึ้นเมื่อได้ผ่านปี ค.ศ. 2000 ไป โดยระบบปฏิบัติการแบบยูนิกซ์ แบบ 32 บิต จะเก็บวันที่ในรูปแบบของเวลายูนิกซ์ ซึ่งทำให้เมื่อถึงปี ค.ศ. 2038 จะเกิด"ข้อผิดพลาดสหัสวรรษของยูนิกซ์"

 สาเหตุ 
เวลาที่สามารถแสดงได้บนระบบเวลาของยูนิกซ์แบบจำนวนเต็ม 32 บิต คือ 03:14:07 ตามเวลาสากลเชิงพิกัด ในวันอังคารที่ 19 มกราคม ค.ศ. 2038 (พ.ศ. 2581) คิดเป็น 2,147,483,647 วินาที หลังจากเริ่มวันที่ 1 มกราคม ค.ศ. 1970 การจัดเก็บเวลาจะถูกย้อนกลับไปอีกครั้งและเก็บเป้นจำนวนเต็มลบ ซึ่งจะทำให้ระบบแสดงวันที่เป็นวันที่ 13 ธันวาคม ค.ศ. 1901 แทนที่จะเป็น 19 มกราคม ค.ศ. 2038 เนื่องจากเกิดบิตจำนวนเต็มล้น (overflow) ทำให้การนับเกิดผิดพลาด และจะกลับบิตเครื่องหมาย โดยจะเป็นจำนวนเต็มลบที่มากที่สุด (เกิดจากการนับขึ้นไปจนถึง 0) โดยปัญหาเช่นนี้เป็นปัญหาใหญ่ในระบบการคำนวณ

โดยจะมีโปรแกรมที่สามารถทำงานกับเวลาในอนาคตได้เพื่อแก้ปัญหานี้ต่อไป (เช่น โปรแกรมสามารถทำงานได้กับวันที่ในอีก 20 ปีข้างหน้า) โดยคาดว่าจะได้รับการพัฒนาภายในปี ค.ศ. 2018

 ปัญหา 
ในเดือนพฤษภาคม พ.ศ. 2549 ได้มีรายงานเกี่ยวกับการปรากฏของปัญหาปี ค.ศ. 2038 บนซอฟต์แวร์ของเอโอแอลเซิร์ฟเวอร์ ซึ่งซอฟต์แวร์ถูกแบบมาพร้อมกับความยากต่อการจัดการฐานข้อมูล โดยคำร้องขอจะไม่ผิดพลาด ซึ่งคำนวณเหตุการณ์พิเศษเช่นนี้ด้วยการระบุวันที่ที่จะเกิดการผิดพลาดในอนาคต เซิร์ฟเวอร์ได้ระบุถึงเวลาที่เกิดผิดพลาดหลังจากผ่านไป 1 พันล้านวินาที (ประมาณ 32 ปี) หลังจาก 21:27:25 นาฬิกา ในวันที่ 12 พฤษภาคม ค.ศ. 2006 หลังจากถึงเวลานั้นการคำนวณจะล้นและย้อนกลับไปยังเวลาในอดีต เหตุมาจากซอฟต์แวร์ผิดพลาด เมื่อปัญหาได้รับการแก้ไข เอโอแอลเซิร์ฟเวอร์ได้จัดการแก้ไขไฟล์และตั้งเวลาผิดพลาดไปยังค่าที่ต่ำกว่าWeird "memory leak" problem in AOLserver 3.4.2/3.x 12 May 2006

ผู้เล่นเกมหรือแอปพลิเคชันจะเกิดปัญหาเมื่อโปรแกรมทำงานผิดพลาด โดยสามารถแก้ไขเบื้องต้นด้วยการปรับเวลาไปยังวันที่ก่อน 19 มกราคม ค.ศ. 2038

 ช่องโหว่ของระบบ 
ระบบฝังตัว เป็นระบบที่ได้รับผลกระทบกับปัญหานี้มากที่สุดระบบหนึ่ง

ในการขนส่งเช่นเครื่องบินหรือรถยนต์ส่วนใหญ่จะใช้ระบบฝังตัว ซึ่งในระบบฝังตัวของยานยนต์นี้ รวมไปถึงระบบเบรกอัตโนมัติ (ABS), ระบบควบคุมอิเล็กทรอนิกส์ (ESC/ESP), ระบบควบคุมแรง (TCS) และการขับเคลื่อนอัตโนมัติแบบ 4 ล้อ ส่วนเครื่องบินจะได้รับผลกระทบในด้านของระบบระบุพิกัด รวมถึงระบบนำทางด้วย อย่างไรก็ดี ไม่ได้หมายความว่าทุกระบบจะต้องเกิดข้อผิดพลาดโดยที่จะไร้ทางแก้ไข ในหลาย ๆ ระบบไม่ต้องการใช้วันที่ หรืออาจต้องการเพียงความแตกต่างของวันเวลา ซึ่งจะทำให้ไม่เกิดปัญหามากเท่าที่ควร ทำให้กรณีนี้เป็นการออกมาตรฐานตามกฎหมายขึ้น เช่น ซีเออาร์บี (CARB)

ระบบฝังตัวถูกใช้ในการสื่อสารเช่นกัน รวมไปถึงโทรศัพท์มือถือและอุปกรณ์ที่ใช้ระบบอินเทอร์เน็ต (เช่น เราเตอร์, แอคเซสพอยต์ไวเลส) ซึ่งระบบเหล่านี้ต้องการใช้วันเวลาที่ถูกต้องอย่างสม่ำเสมอบนระบบปฏิบัติการแบบยูนิกซ์ ยกตัวอย่างเช่น ปัญหานี้จะทำให้อุปกรณ์ที่ใช้แอนดรอยด์ เกิดข้อผิดพลาดและไม่สามารถเปิดขึ้นมาใหม่ได้เมื่อเวลาเปลี่ยนไปในวันที่นั้นIssue 16899 - android - Year 2038 problem

ในปี ค.ศ. 2012 ระบบฝังตัวส่วนใหญ่จะใช้ไมโครโพรเซสเซอร์ 8 บิต หรือ 16 บิตTrends in embedded software design ยกเว้นคอมพิวเตอร์ที่เริ่มใช้ 64 บิตกันแล้ว

แม้ว่าจะใช้เวลา 18 ถึง 24 เดือน ที่ระบบเทคโนโลยีคอมพิวเตอร์จะได้รับการปรับปรุงใหม่ แต่ระบบฝังตัวนั้นถูกออกแบบให้ใช้ได้อย่างทนทานนานหลายปี ซึ่งจะทำให้เกิดความเป็นไปได้ว่าจะมีระบบฝังตัวคงเหลือใช้อยู่จนถึงปี ค.ศ. 2038 ด้วย อีกทั้งมีความเป็นไปได้สูงที่จะไม่สามารถปรับปรุงซอฟต์แวร์ใหม่ในระบบฝังตัวเหล่านั้น

ฐานข้อมูลมายเอสคิวเอล ที่มีฟังก์ชัน UNIX_TIMESTAMP() จะคืนค่า 0 หลังจาก 03:14:07 น. ของวันที่ 19 มกราคม ค.ศ. 2038

 โครงสร้างข้อมูลที่ได้รับผลกระทบ 
ระบบโครงสร้างข้อมูลในปัจจุบันมีการจัดเก็บข้อมูลแบบ 32 บิตค่อนข้างมาก ด้านล่างนี้คือรายการของรูปแบบโครงสร้างข้อมูลที่ได้รับผลกระทบ ซึ่งเป็นโครงสร้างที่ใช้ระบบเวลายูนิกซ์

 ระบบจัดเก็บข้อมูล (ระบบจัดเก็บข้อมูลส่วนใหญ่ใช้ได้เพียง 32 บิต ในการแสดงเวลาในไอโนด)
 ไฟล์ไบนารี (ใช้การระบุเวลา 32 บิต)
 ฐานข้อมูล (ใช้การระบุเวลา 32 บิต)
 ภาษาที่ใช้เรียกฐานข้อมูล เช่น เอสคิวแอล (การใช้คำสั่ง UNIX_TIMESTAMP())

ตัวอย่างระบบที่ได้รับผลกระทบในส่วนของโครงสร้างข้อมูลที่มีการจัดเก็บแบบ 32 บิต

 ระบบที่ใช้ภาษาโคบอล ในยุค ค.ศ. 1970–1990 ซึ่งไม่สามารถเข้าได้กับระบบที่รองรับปัญหา ค.ศ. 2038
 โรงงานที่ถูกตั้งโปรแกรมไว้แล้ว
 อุปกรณ์ทางการแพทย์
 อุปกรณ์ทางการทหาร

ในส่วนของระบบที่ใช้โครงสร้างข้อมูลแบบ 32 บิต จะทำให้เกิดความเสี่ยง โดยความเสียหายจะขึ้นอยู่กับความล้มเหลวว่าเกิดผลกระทบมากน้อยเพียงใด

 ดูเพิ่ม 
 ปัญหาปี ค.ศ. 2000

 อ้างอิง 

หมวดหมู่:วัฒนธรรมอินเทอร์เน็ต
หมวดหมู่:จุดบกพร่องของโปรแกรม
หมวดหมู่:พ.ศ. 2581