مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش استفاده از تاریخ شمسی در سی شارپ (C#) به زبان ساده

استفاده از تاریخ شمسی در زبان سی شارپ (C#) یکی از پرکاربردترین استفاده های برنامه نویسان در برنامه هایشان است به طوری که بتوانند به راحتی همه ی عملیاتی که می توان بر روی تاریخ میلادی در برنامه ها انجام داد را بر روی تاریخ شمسی نیز انجام بدهند. علاوه بر این برنامه نویسان دوست دارند بتوانند به راحتی تاریخ خود را در پایگاه داده ثبت نموده و از آن بخوانند.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

برای یادگیری و آموزش سی شارپ ( آموزش زبان برنامه نویسی سی شارپ ) رایگان به این لینک بروید

اگر بخواهیم این مشکل را در محیط دات نت بررسی کنیم راه های بسیاری در اینترنت وجود دارد که به حل این مسئله پرداخته اند و کتابخانه های زیادی برای این کار نوشته شده است که هرکدام نقص و یا ضعف خاص خود را دارند. روشی که قصد دارم در این مطلب بگویم یکی از راحت ترین راه حل هایی است که برای این مسئله می باشد ولی در عین حال می توان گفت که بهترین راه استفاده از تاریخ شمسی در برنامه است. با این کار شما می توانید همه ی اعمالی را که قابل انجام بر روی تاریخ میلادی است روی تاریخ شمسی نیز انجام دهید.

این روش همچنین این قابلیت را دارد که تاریخ را در بانک اطلاعاتی به راحتی ذخیره و بازیابی نمایید. روش ذخیره سازی این راه حل در بانک اطلاعاتی به این شکل است که تاریخ را در بانک به شکل میلادی ذخیره می کند ولی در برنامه شما تاریخ شمسی دارید. این راه حل به شکل زیر می باشد.ما در این برنامه از کلاس PersianCalendar استفاده می کنیم که این کلاس به طور پیش فرض در کتابخانه System.Globalization; در فریمورک دات نت وجود دارد. برای پیاده سازی این روش کلاس زیر را در برنامه ایجاد می کنیم:

using System;
    using System.Globalization;
    using System.Reflection;
    using System.Threading;

    public class Cultures
    {
        public static void InitializePersianCulture()
        {
            InitializeCulture("fa-ir", new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" },
                              new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" },
                              new[]
                                  {
                                      "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی",
                                      "بهمن", "اسفند", ""
                                  },
                              new[]
                                  {
                                      "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی",
                                      "بهمن", "اسفند", ""
                                  }, "ق.ظ. ", "ب.ظ. ", "yyyy/MM/dd", new PersianCalendar());
        }

        public static void InitializeCulture(string culture, string[] abbreviatedDayNames, string[] dayNames,
                                             string[] abbreviatedMonthNames, string[] monthNames, string amDesignator,
                                             string pmDesignator, string shortDatePattern, Calendar calendar)
        {
            var calture = new CultureInfo(culture);
            var info = calture.DateTimeFormat;
            info.AbbreviatedDayNames = abbreviatedDayNames;
            info.DayNames = dayNames;
            info.AbbreviatedMonthNames = abbreviatedMonthNames;
            info.MonthNames = monthNames;
            info.AMDesignator = amDesignator;
            info.PMDesignator = pmDesignator;
            info.ShortDatePattern = shortDatePattern;
            info.FirstDayOfWeek = DayOfWeek.Saturday;
            var cal = calendar;
            var type = typeof(DateTimeFormatInfo);
            var fieldInfo = type.GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
            if (fieldInfo != null)
                fieldInfo.SetValue(info, cal);
            var field = typeof(CultureInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
            if (field != null)
                field.SetValue(calture, cal);
            Thread.CurrentThread.CurrentCulture = calture;
            Thread.CurrentThread.CurrentUICulture = calture;
            CultureInfo.CurrentCulture.DateTimeFormat = info;
            CultureInfo.CurrentUICulture.DateTimeFormat = info;
        }
    }

فقط همین!! حال برای این که مُد تاریخ در سیستم تغییر کند نقطه شروع برنامه را پیدا می کنیم. این نقطه در برنامه های ویندوزی #C فایل program.cs و تابع main می باشد و همچنین نقطه شروع در برنامه های تحت وب فایل global.asax می باشد. بعد از پیدا کردن نقطه شروع برنامه قطعه کد زیر را در ابتدای برنامه قرار می دهیم.

Cultures.InitializePersianCulture();

این عمل باعث می شود که culture برنامه به فارسی تغییر پیدا کند. حال برای این که از تاریخ شمسی جاری کنونی در برنامه استفاده کنیم از کد DateTime.Now استفاده می کنیم که می بینیم تاریخ شمسی کنونی را به ما برمی گرداند. حال اگر بخواهیم این تاریخ را در بانک اطلاعاتی ذخیره کنیم می بینیم که به جای تاریخ شمسی تاریخ میلادی ذخیره شده است پس بانک نیز مشکلی در آن ندارد. حال اگر بخواهیم با همین برنامه تاریخ ذخیره شده را لود کنیم می بینیم که تاریخ به صورت شمسی نمایش داده می شود.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات