مشكلة السنة الكبيسة
مشكلة السنة الكبيسة ( المعروفة أيضًا باسم خطأ السنة الكبيسة أو خطأ اليوم الكبيس ) هي مشكلة تواجه كلًا من حالات التوثيق وتخزين البيانات الرقمية (المتعلقة بالحاسوب) والتناظرية، والتي تنتج عن أخطاء في حساب السنوات الكبيسة ، أو عن التلاعب بالتواريخ دون مراعاة الفرق بين السنوات الكبيسة والسنوات العادية.
فئات
تندرج أخطاء السنة الكبيسة عادةً ضمن فئتين، بناءً على مقدار التأثير الذي قد تحدثه في الاستخدام الواقعي: [ 1 ]
- تلك التي تؤدي إلى حالات خطأ، مثل الاستثناءات، ورموز إرجاع الخطأ، والمتغيرات غير المهيأة ، أو الحلقات اللانهائية.
- تلك التي تؤدي إلى بيانات غير صحيحة، مثل مشاكل الخطأ بمقدار واحد في استعلامات النطاق أو التجميع.
أمثلة
بايثون
يُعدّ كود بايثون التالي مثالًا على خطأ من الفئة الأولى يتعلق بالسنة الكبيسة. سيعمل الكود بشكل صحيح حتى todayيصل التاريخ إلى 29 فبراير. بعد ذلك، سيحاول إنشاء تاريخ 29 فبراير من سنة عادية، وهو تاريخ غير موجود. dateسيُصدر المُنشئ استثناءً ValueErrorمع الرسالة "اليوم خارج نطاق الشهر". [ 2 ]
from datetime import date today = date.today ( ) later = today.replace ( year = today.year + 1 )ويندوز سي++
يُعدّ كود C++ التالي لنظام Windows مثالًا على خطأ من الفئة الأولى يتعلق بالسنوات الكبيسة. سيعمل الكود بشكل صحيح حتى يصبح التاريخ الحالي هو 29 فبراير من سنة كبيسة. بعد ذلك، سيُعدّل الكود stليمثل 29 فبراير من سنة عادية، وهو تاريخ غير موجود فعليًا. من المرجح أن يفشل تمرير هذا الكود stإلى أي دالة تقبل SYSTEMTIMEبنية بيانات كمعامل.
على سبيل المثال، SystemTimeToFileTimeستُعيد الدالة الموضحة هنا رمز خطأ. وبما أن قيمة الإرجاع هذه غير مُدققة (وهو أمر شائع للغاية) ، فسيؤدي ذلك إلى تركها دون تهيئة. [ 3 ]ft
SYSTEMTIME st ; FILETIME ft ;GetSystemTime ( & st ) ; st.wYear ++ ;SystemTimeToFileTime ( & st , & ft );مايكروسوفت سي شارب
The following .NET C# code is an example of a Category 1 leap year bug. It will work properly until dt becomes February 29. Then, it will attempt to create a February 29 of a common year, which does not exist. The DateTime constructor will throw an ArgumentOutOfRangeException.[4]
DateTimedt=DateTime.Now;DateTimeresult=newDateTime(dt.Year+1,dt.Month,dt.Day);JavaScript
The following JavaScript code is an example of a Category 2 leap year bug. It will work properly until dt becomes February 29, such as on 2020-02-29. Then it will attempt to set the year to 2021. Since 2021-02-29 doesn't exist, the Date object will roll forward to the next valid date, which is 2021-03-01.[5]
vardt=newDate();dt.setFullYear(dt.getFullYear()+1);Bad leap year algorithm (many languages)
The following code is an example of a leap year bug that is seen in many languages. It may cause either a Category 1 or Category 2 impact, depending on what the result is used for. It incorrectly assumes that a leap year occurs exactly every four years.[6]
boolisLeapYear=year%4==0;The correct leap year algorithm is explained here: .
Occurrences
- Microsoft Excel has, since its earliest versions, incorrectly considered 1900 to be a leap year, and therefore that February 29 comes between February 28 and March 1 of that year. The bug originated from Lotus 1-2-3, and was purposely implemented in Excel for the purpose of backward compatibility. Microsoft has written an article about this bug, explaining the reasons for treating 1900 as a leap year.[7] This bug has been promoted into a requirement in the Ecma Office Open XML (OOXML) specification.[8][9]
- في عام 1996، وتحديداً في 31 ديسمبر، تعطلت جميع أجهزة الكمبيوتر الـ 660 التي تتحكم بخطوط صهر الألومنيوم في مصنعي تيواي بوينت بنيوزيلندا، وبيل باي في تسمانيا بأستراليا، عند منتصف الليل، وذلك لعدم برمجتها للتعامل مع اليوم 366 من السنة (حيث كانت سنة 1996 سنة كبيسة وتضمنت يوم 29 فبراير). وقُدّرت تكاليف الإصلاح بأكثر من مليون دولار نيوزيلندي . [ 10 ]
- في عام 2000، وتحديدًا في 31 ديسمبر، اكتشفت شركة السكك الحديدية الوطنية النرويجية "في" أن جميع قطاراتها الـ 29 الجديدة من طراز "سيجناتور " لا تعمل، وذلك لأن أجهزة الكمبيوتر الموجودة على متنها لم تتعرف على التاريخ باعتباره اليوم 366 من السنة. وكإجراء مؤقت، أعاد المهندسون تشغيل القطارات عن طريق إعادة ضبط ساعاتها إلى الوراء شهرًا واحدًا. [ 11 ] [ 12 ] [ 13 ]
- في منتصف ليل 31 ديسمبر 2008، تجمدت العديد من أجهزة Zune 30 من الجيل الأول [ 14 ] . [ 15 ] [ 16 ] صرّحت مايكروسوفت بأن المشكلة ناجمة عن برنامج تشغيل الساعة الداخلي الذي طورته شركة فري سكيل، وطريقة تعامل الجهاز مع السنة الكبيسة. وقد تم إصلاح المشكلة تلقائيًا بعد 24 ساعة، ولكن كان هناك حل مؤقت لمن لا يرغبون بالانتظار، وهو استنزاف بطارية الجهاز ثم إعادة شحنها بعد ظهر يوم 1 يناير 2009 بتوقيت غرينتش. [ 17 ] [ 18 ]
- تعامل جهاز بلاي ستيشن 3 من سوني بشكل خاطئ مع عام 2010 على أنه سنة كبيسة، لذلك تم عرض تاريخ 29 فبراير 2010 غير الموجود في 1 مارس 2010، مما تسبب في حدوث خطأ في البرنامج . [ 19 ]
- في عام 2012، تعطلت أجهزة الملاحة عبر الأقمار الصناعية من نوع TomTom بسبب خلل في السنة الكبيسة ظهر لأول مرة في 31 مارس. [ 20 ]
- في عام 2012، أظهر سجل محادثات Gmail تاريخ 31 ديسمبر 1969 لجميع المحادثات المحفوظة في 29 فبراير .
- في عام ٢٠١٢، تعطلت خدمة مايكروسوفت أزور بسبب خلل في السنة الكبيسة في ٢٨ فبراير، مما تسبب في تعطل الأجهزة الافتراضية عند بدء التشغيل. في تمام الساعة ٥:٤٥ مساءً بتوقيت المحيط الهادئ، علم فريق ويندوز أزور بوجود مشكلة، تبين لاحقًا أنها ناجمة عن عملية "بعد عام من الآن" التي تضمنت تغيير السنة دون تغيير اليوم. [ ٢١ ]
- في عام 2016، تسبب خلل في نظام نقل الأمتعة في مطار دوسلدورف في 29 فبراير في تأخر أكثر من 1200 قطعة من الأمتعة عن رحلاتها. [ 22 ]
- في عام 2024، تسبب خلل في أجهزة الدفع الذاتي بسبب السنة الكبيسة في توقف محطات الوقود التي تعمل بنظام الدفع عند المضخة في نيوزيلندا عن العمل لأكثر من 10 ساعات. [ 23 ]
للاطلاع على قوائم أكثر تفصيلاً لأخطاء السنة الكبيسة في الأعوام 2016، [ 24 ] 2020، [ 25 ] و2024، [ 26 ]، انظر موقع Code of Matt الإلكتروني .
انظر أيضاً
مراجع
- ↑ جونسون-بينت، مات. "ما هي بعض الأمثلة على أخطاء السنة الكبيسة؟" . ستاك أوفرفلو . تم الاسترجاع في 5 فبراير 2020 .
- ↑ جونسون-بينت، مات. "بايثون - استبدال السنة" . ستاك أوفرفلو . تم الاسترجاع في 29 فبراير 2020 .
- ↑ جونسون-بينت، مات. "معالجة بنية SYSTEMTIME في Win32 / C++" . ستاك أوفرفلو . تم الاسترجاع في 5 فبراير 2020 .
- ↑ جونسون-بينت، مات. ".NET / C# - إنشاء من أجزاء التاريخ" . ستاك أوفرفلو . تم الاسترجاع في 5 فبراير 2020 .
- ↑ جونسون-بينت، مات. "جافا سكريبت - إضافة سنة/سنوات" . ستاك أوفرفلو . تم الاسترجاع في 5 فبراير 2020 .
- ↑ جونسون-بينت، مات. "تحديد ما إذا كانت السنة سنة كبيسة" . ستاك أوفرفلو . تم الاسترجاع في 5 فبراير 2020 .
- ↑ يفترض برنامج إكسل خطأً أن عام 1900 هو سنة كبيسة . تم الاطلاع عليه بتاريخ 1 مايو 2019.
- ↑ معيار ECMA-376 / تنسيقات ملفات Open Office XML . تم الاطلاع عليه بتاريخ 10-09-2016.
- ↑ ISO/IEC 29500 / تنسيقات ملفات Open Office XML . تم الاطلاع عليه بتاريخ 10-09-2016.
- ↑ تاولر، جيم (7 يناير 1997). "خلل برمجي في السنة الكبيسة يتسبب في "خلل بملايين الدولارات"" ملخص المخاطر . 18 (74). لجنة الحوسبة والسياسة العامة التابعة لجمعية آلات الحوسبة . تم الاطلاع عليه في 5 فبراير 2020. "
- ↑ "اللدغة الأخيرة للحشرة" . بي بي سي نيوز . 5 يناير 2001.
- ↑ "أنظمة سفن إيليفن تتعرض لخلل مشابه لخلل عام 2000" . تم الاطلاع عليه بتاريخ 10 مارس 2023 .
- ↑ "مشكلة عام 2000 تُصيب خطوط السكك الحديدية النرويجية في نهاية العام" . 1 يناير 2001. تم الاطلاع عليه بتاريخ 10 مارس 2023 .
- ↑ "الصفحة الرئيسية - إجابات مايكروسوفت" . Forums.zune.net. مؤرشف من الأصل في 30 أغسطس 2009. تم الاطلاع عليه في 27 يوليو 2011 .
- ↑ جون هيرمان (31 ديسمبر 2008). "أجهزة زون بسعة 30 جيجابايت تتعطل في كل مكان، دفعة واحدة" . Gizmodo.com. مؤرشف من الأصل بتاريخ 12 أغسطس 2011. تم الاطلاع عليه بتاريخ 27 يوليو 2011 .
- ↑ جير، دنكان (31 ديسمبر 2008). "عاجل: تعطل غامض لأجهزة زون في جميع أنحاء العالم : ملخص تقني" . Techdigest.tv . تم الاطلاع عليه بتاريخ 27 يوليو 2011 .
- ↑ "الأسئلة الشائعة حول Zune 30" . مايكروسوفت . 31 ديسمبر 2008. مؤرشف من الأصل في 2 يناير 2009. تم الاطلاع عليه في 1 يناير 2009 .
- ↑ زاديجان، براينت (3 يناير 2009). "درس في الحلقات اللانهائية" . AeroXperience . تم الاسترجاع في 5 يناير 2009 .
- ↑ "سوني تُصلح خلل السنة الكبيسة في جهاز بلاي ستيشن 3" . مترو . 2 مارس 2010. تم الاطلاع عليه بتاريخ 10 أكتوبر 2019 .
- ↑ "أجهزة الملاحة عبر الأقمار الصناعية من توم توم تتأثر بخلل في نظام تحديد المواقع العالمي (GPS) بسبب "السنة الكبيسة"" . بي بي سي نيوز . 3 أبريل 2012. تم الاطلاع عليه في 5 فبراير 2020. "
- ↑ "ملخص انقطاع خدمة ويندوز أزور في 29 فبراير 2012" . azure.microsoft.com . 9 مارس 2012. تم الاطلاع عليه في 23 يناير 2025 .
- ↑ "عطلة في المطار تُسبب إحراجاً لمئات المسافرين" . صحيفة ذا لوكال (ألمانية) . مارس 2016. تاريخ الاطلاع: 5 فبراير 2020 .
- ↑ «عودة محطات الوقود للعمل بعد انقطاع دام يومًا كاملاً، يُعزى إلى خلل في السنة الكبيسة» . صحيفة نيوزيلندا هيرالد . 1 مارس 2024. تاريخ الاطلاع: 29 فبراير 2024 .
- ↑ جونسون-بينت، مات (29 فبراير 2016). "قائمة أخطاء يوم 29 فبراير 2016" . كود مات . تم الاسترجاع في 5 فبراير 2020 .
- ↑ جونسون-بينت، مات (29 فبراير 2020). "قائمة أخطاء يوم 29 فبراير 2020" . كود مات . تم الاسترجاع في 9 مارس 2020 .
- ↑ "قائمة أخطاء يوم 29 فبراير 2024" . كود مات . 29-02-2024 . تم الاطلاع عليه بتاريخ 29-02-2024 .
- التقاويم
- أخطاء برمجية
- مخاطر التكنولوجيا
- أخطاء في تنسيق الوقت والتخزين
