السلام عليكم ورحمة الله وبركاته
بالطيع من الممكن أن تستغنى عن قراءة هذا الموضوع بكتابة سطر واحد من الكود مثل
Dim LeapYear As Boolean = System.DateTime.IsLeapYear(2006)
وسوف يؤدى نفس الغرض
ولكن
هل تعلم ما وراء هذا السطر
وكيف تم تحديد النسة البسيطة من السنة الكبيسة؟
إن هذا الموضوع ليس برمجياً بالدرجة الأولى بقدر ما هو ثقافي
فالتقويم الميلادي يقوم على أساس أن كل ثلاث سنوات بسيطة تكون بمعدل
365
يوما
والسنة الرابعة تكون كبيسة بمعدل
366
يومًا
واستمر هذا التقويم إلى سنة
1582
ميلادياً ، وبالضبط في تاريخ
4/10/1582
حيث لاحظ الفلكيون في هذا السنة في عهد البابا الثالث عشر جريجوري أن دوران الأرض حول الشمس في السنة الواحدة ليس
365.25
يومًا
إنما أقل بقليل من ذلك
حيث أن دوران الأرض حول الشمس في السنة الشمسية أو السنة المدارية الواحدة يساوي
365.24219878
وهذه الفترة الزمنية التي هي بمقدار
0.0078
من اليوم في السنة الواحدة قد غيرت فصول السنة على مدى السنين المنصرمة
لذا أمر البابا جوريجوري بإجراء إصلاح على التقويم المقدم من الفلكيين حول هذا الفرق
فتقرر إصلاح التقويم كالآتي
1-
تغييرالتاريخ بعد يوم
4/10/1582
إلى
15/10/1582
بدلاً من
5/10/1582
وذلك حتى يتلاقى فارق السنين المُنصرمة مع الزيادة
2-
تبقى السنوات الكبيسة كما هي
أي أن أي سنة تقبل القسمة على رقم
4
بدون باقي فهي كبيسة، وما عداها يكون سنة بسيطة
باستثناء (رؤوس القرون) أي السنوات التي يكون آحادها وعشراتها (00) لا تكون كبيسة إلا إذا قبلت القسمة على رقم
400
بدون باق
أو إذا كانت السنة واقعة في رأس قرن يُحذف الصفران في آحادها وعشراتها وباقي رقم السنة إذا قبل القسمة على رقم
4
من دون باق تكون كبيسة
وعلى هذا يكون في كل
400
سنة شمسية يوجد
97
سنة كبيسة
في حين ان التقويم الأصلى قبل ذلك كان يُوجد
100
سنة كبيسة كل
400
سنة
ولكى نترجم ما سبق إلى دالة برمجية فإننا سوف نقوم بالآتى
إذا كانت السنة لا تقبل القسمة على
4
بدون باقى فهى سنة بسيطة
If year Mod 4 <> 0 The
Return False
End If
ونخرج من الإجراء
أما فى حالة كونها تقبل القسمة فهناك حالتين
الحالة الأولى
أن تقبل القسمة على
100
بدون باقى
فإذا قيبت أيضاً القسمة على
400
بدون باقى تصيح سنة كبيسة
If year Mod 100 = 0 Then
Return year Mod 400 = 0
أما الحالة الثانية فهى دوما كبيسة
Else
Return True
End If
وفى النهاية هذا هو الشكل الأخير للدالة
#Region " IsLeapYear " ''' <summary> ''' Returns an indication whether the ''' specified year is a leap year. ''' </summary> ''' <param name="year"> ''' A 4-digit year. ''' </param> ''' <returns> ''' True if year is a leap year; otherwise, false. ''' </returns> Public Shared Function IsLeapYear(ByVal year As Integer) As Boolean If year Mod 4 <> 0 Then Return False End If If year Mod 100 = 0 Then Return year Mod 400 = 0 Else Return True End If End Function 'IsLeapYear #End Region
والله المُستعان