วันพุธที่ 1 กุมภาพันธ์ พ.ศ. 2555

ปัญหา Y2K

ปัญหา Y2K คืออะไร
      คำตอบสั้นๆคือคำย่อของ Year 2000 ซึ่งหมายถึงปี ค.ศ. 2000 โดย
      Y   ย่อมาจากคำว่า Year
      K  เป็นหน่วยในการวัดค่าต่างๆ ในระบบเมตริก มีค่าเท่ากับ 1000
      2K จึงมีค่า 2x1000 เท่ากับ 2000
      ดังนั้น Y2K ก็คือ Year 2000 นั่นเอง
ปัญหา Y2K คืออะไรกันแน่
      ปัญหา Y2K คือปัญหาซึ่งจะเกิดขึ้นกับระบบคอมพิวเตอร์และเครื่องมือทุกชนิดที่มี
ส่วนควบคุมเป็น Micro Chip ซึ่งมีการทำงานต่างๆขึ้นกับวันและเวลาในตัว Micro Chip
ที่เราเรียกว่า Real Time Clock (RTC)   หากอุปกรณ์ใดก็ตามที่ไม่ได้ใช้วันและเวลาในตัว
Micro Chip ในการทำงานหรือใช้เฉพาะเวลาเพียงอย่างเดียวจะไม่ได้รับผลกระทบจาก
ปัญหา Y2K เลย
     ปัญหา ค.ศ. 2000 นอกจากจะเรียกว่า Y2K Bug แล้วยังมีชื่ออื่นอีก เช่น Millennium Bug
เป็นต้น


ต้นเหตุของปัญหา Y2K
 1. การเก็บข้อมูลปี ค.ศ. เฉพาะแค่ 2 หลักท้ายแทนที่จะเก็บเต็ม 4 หลัก
โดยถือว่า 2 หลักหน้าคือ 19 เสมอ  เช่น 1998 จะเก็บแค่เพียง 98 ดังนั้นข้อมูล
ในระบบจึงมีค่าอยู่ในช่วงระหว่างปี ค.ศ. 1900-1999 เท่านั้น เมื่อถึงปี ค.ศ. 2000
คอมพิวเตอร์ยังคงถือว่า 2 หลักหน้าคือ 19 อยู่เหมือนเดิม  เมื่อป้อนปีเป็น 00
ซึ่งหมายถึงปี ค.ศ. 2000  คอมพิวเตอร์ยังคงตีความว่าเป็นปี ค.ศ. 1900 เหมือนเดิม  คังนั้นการคำนวณเกี่ยวกับระยะเวลา เช่น  การคำนวณอายุ การคำนวณระยะเวลา
การชำระหนี้และการเรียงลำดับข้อมูลจึงผิดพลาดหมด
ตัวอย่าง การคำนวณอายุคนเกิดปี ค.ศ. 1960
การคำนวณอายุที่ผิดพลาด
    ค.ศ. 1998 อายุ 1998 -1960 =  38 ปี   หรือ อายุ 98 - 60 =  38  ปี
    ค.ศ. 1999 อายุ 1999 -1960 =  39 ปี   หรือ อายุ 99 - 60 =  39  ปี
    ค.ศ. 2000 อายุ 1900 -1960 = -60 ปี   หรือ อายุ 00 - 60 = -60  ปี
 การคำนวณอายุที่ถูกต้อง
    ค.ศ. 1998 อายุ 1998 -1960 = 38  ปี
    ค.ศ. 1999 อายุ 1999 -1960 = 39  ปี
    ค.ศ. 2000 อายุ 2000 -1960 = 40  ปี
    ตัวอย่าง การเรียงลำดับข้อมูลยอดขายระหว่างปี 1997 - 2001
    การเรียงลำดับข้อมูลยอดขายที่ผิด (เพราะ 00 and 01 มาก่อน 97, 98 และ 99)
       
      0001979899
      $66$77$33$44$55
        หรือ
       
      19001901199719981999
      $66$77$33$44$55
       การเรียงลำดับข้อมูลยอดขายที่ถูกต้อง
       
      19971998199920002001
      $33$44$55$66$77
    2. การคำนวณปีอธิกสุรทิน (Leap Year) ไม่ถูกต้องทำให้เดือนกุมภาพันธ์
    ปี ค.ศ. 2000 มีเพียง 28 วันเท่านั้น ทำให้การคำนวณหาวันที่ในปี
    (Day of Year) หลังเดือนกุมภาพันธ์ผิดพลาดหมด
    กฎในการคำนวณ Leap Year ที่ถูกต้องคือ
           1. ปีที่หารด้วย 4 ลงตัวจะเป็นปีอธิกสุรทิน
           2. ปีที่หารด้วย 100 ลงตัวจะไม่เป็นปีอธิกสุรทิน
           3. ปีที่หารด้วย 400 ลงตัวจะเป็นปีอธิกสุรทิน
    หากสลับกฏข้อ 2 และกฎข้อ 3 จะทำให้การคำนวณปีอธิกสุรทินของ
    ปีค.ศ. 2000 ผิดพลาด  ดังนั้นการคำนวณจะต้องทำให้ถูกต้องตามลำดับPsodo Code การคำนวณปีอธิกสุรทิน (Leap Year Calculation)
        if (year mod 4 == 0) and ((year mod 100 != 0) or (year mod 400 == 0))
            { use 29 for days in February }
        else
            { use 28 for days in February }
    3. การใส่เลขซึ่งมีความหมายพิเศษ (Magic Number) ไว้ในโปรแกรม เช่นใส่
    วันหมดอายุไว้เป็น 9/9/99 ทำให้โปรแกรมหมดอายุเมื่อถึงวันที่ 9 กันยายน 1999 เป็นต้น
    4. การแทนวันและเวลาโดยการนับจากเวลาอ้างอิงในอดีต  เช่น
    ระบบหาตำแหน่งด้วยดาวเทียม Global Posisioning System (GPS) จะใช้ตัวเลขขนาด 10 บิต(Bits) แทนค่าเวลาเป็นสัปดาห์ (Week)
    นับตั้งแต่เดือนมกราคม 1980 เป็นต้นมา  ซึ่งจะแทนค่าได้ 1024 สัปดาห์
    (Week) และจะ Roll Over ในวันที่ 21 สิงหาคม 1999  ระบบ Unix เก็บวันและเวลาโดยการแทนค่าวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970
    ด้วยตัวเลขขนาด 32 บิต  ซึ่งจะ Roll Over ในปี 2038 เป็นต้น
    5. เครื่องคอมพิวเตอร์ส่วนบุคคล (Personal Computer - PC) ไม่น้อยกว่า
    85 % ไม่สามารถ Roll Over จาก 1999-12-31 (31 ธ.ค. 1999) ไปเป็น
    2000-01-01 (1 มกราคม 2000) ได้  โดยเครื่องจะตั้งวันที่กลับไปยังวันที่
    ตัว BIOS ของเครื่องถูกสร้างขึ้นมา เช่น เป็น 1980-01-04 (4 มกราคม 1980)
    ในเครื่องรุ่นเก่าหรือ 1994-01-04 (4 มกราคม 1994) ในเครื่องรุ่นใหม่หลัง
    ปี 1995 เป็นต้นมา
    6. วันในตัว Real Time Clock (RTC) ในอุปกรณ์ที่มี Micro Chip ควบคุม
    (Embedded System) ทุกชนิด จะกลับไปตั้งต้นที่ 1900-01-01 (1 มกราคม 1900)
    การคำนวณค่าต่างๆที่เกี่ยวข้องกับวัน เช่น วันในสัปดาห์ (Day of Week)
    สัปดาห์ในปี (Week of Year) และปีอธิกสุรทิน (Leap Year) จะคลาดเคลื่อนหมด
    เนื่องจาก 1900-01-01 (1 มกราคม 1900) ตรงกับวันจันทร์  แต่ 2000-01-01
    (1 มกราคม 2000) ตรงกับวันเสาร์  และปี 2000 เป็นปีอธิกสุรทิน (Leap Year)
    แต่ปี 1900 ไม่ใช่ปีอธิกสุรทิน (Leap Year) 

ไม่มีความคิดเห็น:

แสดงความคิดเห็น