التحويل من التاريخ الميلادي إلى الهجري والعكس

03 فبراير 2017     401 مشاهدة    0 تعليق
تم النشر في #DateTime Conversion 

من المعلوم لدى أغلب المبرمجين أن التعامل مع التواريخ هي واحد من أهم الأمور في أغلب البرامج والتطبيقات, وكذلك دعم التاريخ الهجري هو أحد الأمور الضرورية خصوصاً في التعريب Localization.

لذا أحببت أن اتطرق اليوم إلى موضوع التحويل من التاريخ الميلادي إلى الهجري ومن الهجري للميلادي, طبعاً أحببت ايضاً أن أقوم بإستخدام احدى مميزات لغة السي شارب ألا وهي الـ Extension Methods, ليتم إستخدام الدوال التي سيتم إنشاءها كأي دالة موجوده في النوع DateTime.

لنلقي نظرة على الشفرة المصدرية التالية:

public static class DateTimeExtensions
{
    public static DateTime ToHijri(this DateTime dateTime)
    {
        var gregorianDate = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day,
            dateTime.Hour, dateTime.Minute, dateTime.Second, new GregorianCalendar());
        var hijriCalendar = new HijriCalendar();

        return new DateTime(hijriCalendar.GetYear(gregorianDate), hijriCalendar.GetMonth(gregorianDate),
            hijriCalendar.GetDayOfMonth(gregorianDate), hijriCalendar.GetHour(gregorianDate),
            hijriCalendar.GetMinute(gregorianDate), hijriCalendar.GetSecond(gregorianDate));
    }

    public static DateTime ToGregorian(this DateTime dateTime)
    {
        var hijriDate = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day,
            dateTime.Hour, dateTime.Minute, dateTime.Second, new HijriCalendar());
        var gregorianCalendar = new GregorianCalendar();

        return new DateTime(gregorianCalendar.GetYear(hijriDate), gregorianCalendar.GetMonth(hijriDate),
            gregorianCalendar.GetDayOfMonth(hijriDate), gregorianCalendar.GetHour(hijriDate),
            gregorianCalendar.GetMinute(hijriDate), gregorianCalendar.GetSecond(hijriDate));
    }
}

من المثال أعلاه تم إنشاء فئة DateTimeExtensions لتحتوي على الدالتين ToHijri() و ToGregorian() واللاتين تقومين بالتحويل بين التاريخ الميلادي والهجري والعكس. ومن الملاحظ فقد تم إستخدام الفئتين HijriCalendar و GregorianCalendar والذين يمثلان التقويمين الهجري والميلادي.

فببساطة تم إستخدام كلا التقويمان ليقوم كل واحد منهما بالتعبير عن التاريخ المدخل بحسب التقويم المختار ومن ثم يتم جلب السنه, الشهر, اليوم .. إلخ بإستخدام التقويم الآخر.

أخيراً يمكنك إستخدام الدالتين على النحو التالي:

var todayGregorian = DateTime.Now;
var todayHijri = todayGregorian.ToHijri();

Console.WriteLine("Hijri: {0}", todayHijri);
Console.WriteLine("Gregorian: {0)}", todayHijri.ToGregorian());

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك