تبدیل تاریخ میلادی به شمسی و برعکس در ASP.net

 

تقویم فارسی در بیشتر کشور ها و مناطقی که به زبان فارسی صحبت می کنند، استفاده می شود. با اینکه برخی مناطق از نام های مختلف برای ماه ها استفاده می کنند اما تقویمی مشترک دارند. تقویم فارسی تقویم رسمی ایران و افغانستان است و یکی از تقویم های جایگزین در مناطقی مانند قزاقستان و تاجیکستان می باشد.
در این مقاله قصد داریم روش تبدیل تاریخ میلادی به شمسی و برعکس آن را در ASP.net توضیح دهیم. برای انجام این کار روش های مختلفی با در نظر گرفتن کلاس های متفاوت و حتی انواع زبان های برنامه نویسی وجود دارد. ما قصد داریم برای این کار از کلاس PersianCalendar و Datetime استفاده کنیم.
اگر قصد دارید از asp.net mvc استفاده کنید، بعد از ایجاد کلاس model در کنترل view، از کلاس PersianCalendar استفاده کنید.

دوره آموزش ساخت وب سایت درگاه واسط بانکی با asp core 3 و angular 9

کلاس PersianCalendar

این کلاس با زبان های c++ ، VB و F# هم وجود دارد که در این جا ما با زبان C# آن را نوشته ایم.
public class PersianCalendar : System.Globalization.Calendar

مثال زیر شی DateTime را با استفاده از ویژگی DateTime.Now ، سازنده DateTime و روش ToDateTime تقویم فارسی (Int32 ، Int32 ، Int32 ، Int32 ، Int32 ، Int32 ، Int32) نمونه برداری می کند. سپس این تاریخ ها را در تقویم میلادی و ایرانی نمایش می دهد. همچنین محدوده تاریخ تقویم فارسی را نیز نشان می دهد.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
        PersianCalendar pc = new PersianCalendar();
        DateTime thisDate = DateTime.Now;

        // Display the current date using the Gregorian and Persian calendars.
        Console.WriteLine("Today in the Gregorian Calendar:  {0:dddd}, {0}", thisDate);
        Console.WriteLine("Today in the Persian Calendar:    {0}, {1}/{2}/{3} {4}:{5}:{6}\n",
                      pc.GetDayOfWeek(thisDate),
                      pc.GetMonth(thisDate),
                      pc.GetDayOfMonth(thisDate),
                      pc.GetYear(thisDate),
                      pc.GetHour(thisDate),
                      pc.GetMinute(thisDate),
                      pc.GetSecond(thisDate));

        // Create a date using the Gregorian calendar.
        thisDate = new DateTime(2013, 5, 28, 10, 35, 0);
        Console.WriteLine("Gregorian Calendar:  {0:D} ", thisDate);
        Console.WriteLine("Persian Calendar:    {0}, {1}/{2}/{3} {4}:{5}:{6}\n",
                          pc.GetDayOfWeek(thisDate),
                          pc.GetMonth(thisDate),
                          pc.GetDayOfMonth(thisDate),
                          pc.GetYear(thisDate),
                          pc.GetHour(thisDate),
                          pc.GetMinute(thisDate),
                          pc.GetSecond(thisDate));

        // Create a date using the Persian calendar.
        thisDate = pc.ToDateTime(1395, 4, 22, 12, 30, 0, 0);
        Console.WriteLine("Gregorian Calendar:  {0:D} ", thisDate);
        Console.WriteLine("Persian Calendar:    {0}, {1}/{2}/{3} {4}:{5}:{6}\n",
                      pc.GetDayOfWeek(thisDate),
                      pc.GetMonth(thisDate),
                      pc.GetDayOfMonth(thisDate),
                      pc.GetYear(thisDate),
                      pc.GetHour(thisDate),
                      pc.GetMinute(thisDate),
                      pc.GetSecond(thisDate));

        // Show the Persian Calendar date range.
        Console.WriteLine("Minimum Persian Calendar date (Gregorian Calendar):  {0:D} ",
                          pc.MinSupportedDateTime);
        Console.WriteLine("Minimum Persian Calendar date (Persian Calendar):  " +
                          "{۰}, {۱}/{۲}/{۳} {۴}:{۵}:{۶}\n",
                          pc.GetDayOfWeek(pc.MinSupportedDateTime),
                          pc.GetMonth(pc.MinSupportedDateTime),
                          pc.GetDayOfMonth(pc.MinSupportedDateTime),
                          pc.GetYear(pc.MinSupportedDateTime),
                          pc.GetHour(pc.MinSupportedDateTime),
                          pc.GetMinute(pc.MinSupportedDateTime),
                          pc.GetSecond(pc.MinSupportedDateTime));

        Console.WriteLine("Maximum Persian Calendar date (Gregorian Calendar):  {0:D} ",
                          pc.MaxSupportedDateTime);
        Console.WriteLine("Maximum Persian Calendar date (Persian Calendar):  " +
                          "{۰}, {۱}/{۲}/{۳} {۴}:{۵}:{۶}\n",
                          pc.GetDayOfWeek(pc.MaxSupportedDateTime),
                          pc.GetMonth(pc.MaxSupportedDateTime),
                          pc.GetDayOfMonth(pc.MaxSupportedDateTime),
                          pc.GetYear(pc.MaxSupportedDateTime),
                          pc.GetHour(pc.MinSupportedDateTime),
                          pc.GetMinute(pc.MaxSupportedDateTime),
                          pc.GetSecond(pc.MaxSupportedDateTime));
   }
}
// The example displays the following output when run under the .NET Framework 4.6:
//    Today in the Gregorian Calendar:  Monday, 2/4/2013 9:11:36 AM
//    Today in the Persian Calendar:    Monday, 11/16/1391 9:11:36
//
//    Gregorian Calendar:  Tuesday, May 28, 2013
//    Persian Calendar:    Tuesday, 3/7/1392 10:35:0
//
//    Gregorian Calendar:  Tuesday, July 12, 2016
//    Persian Calendar:    Tuesday, 4/22/1395 12:30:0
//
//    Minimum Persian Calendar date (Gregorian Calendar):  Friday, March 22, 0622
//    Minimum Persian Calendar date (Persian Calendar):  Friday, 1/1/1 0:0:0
//
//    Maximum Persian Calendar date (Gregorian Calendar):  Friday, December 31, 9999
//    Maximum Persian Calendar date (Persian Calendar):  Friday, 10/13/9378 0:59:59
//
// The example displays the following output when run under versions of
// the .NET Framework before the .NET Framework 4.6:
//    Today in the Gregorian Calendar:  Monday, 2/4/2013 9:11:36 AM
//    Today in the Persian Calendar:    Monday, 11/16/1391 9:11:36
//
//    Gregorian Calendar:  Tuesday, May 28, 2013
//    Persian Calendar:    Tuesday, 3/7/1392 10:35:0
//
//    Gregorian Calendar:  Tuesday, July 12, 2016
//    Persian Calendar:    Tuesday, 4/22/1395 12:30:0
//
//    Minimum Persian Calendar date (Gregorian Calendar):  Thursday, March 21, 0622
//    Minimum Persian Calendar date (Persian Calendar):  Thursday, 1/1/1 0:0:0
//
//    Maximum Persian Calendar date (Gregorian Calendar):  Friday, December 31, 9999
//    Maximum Persian Calendar date (Persian Calendar):  Friday, 10/10/9378 0:59:59

مثال زیر اعضای فیلد ، ویژگی و متد کلاس PersianCalendar را نشان می دهد.

using System;
using System.Globalization;

class Sample
{
    public static void Main()
    {
      PersianCalendar jc = new PersianCalendar();
      DateTime thisDate = DateTime.Now;

        //--------------------------------------------------------------------------------
        // Properties
        //--------------------------------------------------------------------------------
      Console.WriteLine("\n........... Selected Properties .....................\n");
      Console.Write("Eras:");
      foreach (int era in jc.Eras)
      {
         Console.WriteLine(" era = {0}", era);
      }
        //--------------------------------------------------------------------------------
      Console.WriteLine("\nTwoDigitYearMax = {0}", jc.TwoDigitYearMax);
        //--------------------------------------------------------------------------------
        // Methods
        //--------------------------------------------------------------------------------
      Console.WriteLine("\n............ Selected Methods .......................\n");

        //--------------------------------------------------------------------------------
      Console.WriteLine("GetDayOfYear: day = {0}", jc.GetDayOfYear(thisDate));
        //--------------------------------------------------------------------------------
      Console.WriteLine("GetDaysInMonth: days = {0}",
                        jc.GetDaysInMonth( thisDate.Year, thisDate.Month,
                        PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------
      Console.WriteLine("GetDaysInYear: days = {0}",
                        jc.GetDaysInYear(thisDate.Year, PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------
      Console.WriteLine("GetLeapMonth: leap month (if any) = {0}",
                        jc.GetLeapMonth(thisDate.Year, PersianCalendar.PersianEra));
        //-------------------------------------------------------------
      Console.WriteLine("GetMonthsInYear: months in a year = {0}",
                        jc.GetMonthsInYear(thisDate.Year, PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------
      Console.WriteLine("IsLeapDay: This is a leap day = {0}",
                        jc.IsLeapDay(thisDate.Year, thisDate.Month, thisDate.Day,
                        PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------
      Console.WriteLine("IsLeapMonth: This is a leap month = {0}",
                        jc.IsLeapMonth(thisDate.Year, thisDate.Month,
                        PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------
      Console.WriteLine("IsLeapYear: 1370 is a leap year = {0}",
                        jc.IsLeapYear(1370, PersianCalendar.PersianEra));
        //--------------------------------------------------------------------------------

        // Get the 4-digit year for a year whose last two digits are 99. The 4-digit year
        // depends on the current value of the TwoDigitYearMax property.

      Console.WriteLine("ToFourDigitYear:");
      Console.WriteLine("  If TwoDigitYearMax = {0}, ToFourDigitYear(99) = {1}",
                         jc.TwoDigitYearMax, jc.ToFourDigitYear(99));
      jc.TwoDigitYearMax = thisDate.Year;
      Console.WriteLine("  If TwoDigitYearMax = {0}, ToFourDigitYear(99) = {1}",
                        jc.TwoDigitYearMax, jc.ToFourDigitYear(99));
    }
}
// The example displays the following output:
//       ........... Selected Properties .....................
//
//       Eras: era = 1
//
//       TwoDigitYearMax = 99
//
//       ............ Selected Methods .......................
//
//       GetDayOfYear: day = 1
//       GetDaysInMonth: days = 31
//       GetDaysInYear: days = 365
//       GetLeapMonth: leap month (if any) = 0
//       GetMonthsInYear: months in a year = 12
//       IsLeapDay: This is a leap day = False
//       IsLeapMonth: This is a leap month = False
//       IsLeapYear: 1370 is a leap year = True
//       ToFourDigitYear:
//         If TwoDigitYearMax = 99, ToFourDigitYear(99) = 99
//         If TwoDigitYearMax = 2012, ToFourDigitYear(99) = 1999

توضیحات

همانطور که می دانید تاریخ های تقویم فارسی از سال های هجری شروع می شود که مرتبط با سال ۶۲۲ میلادی است و سالی است که حضرت محمد (ص) از مکه به مدینه مهاجرت کرد. به عنوان مثال ، تاریخ ۲۱ مارس ۲۰۰۲ میلادی مطابق با اولین روز ماه فروردین سال ۱۳۸۱هجری شمسی است.
تقویم فارسی بر اساس یک سال شمسی می باشد و تقریباً ۳۶۵ روز دارد. هر سال چهار فصل را طی می کند و وقتی خورشید از نیم کره جنوبی به نیم کره شمالی از مرکز زمین عبور می کند ، یک سال جدید آغاز می شود. سال جدید اولین روز فروردین ماه است که اولین روز بهار در نیم کره شمالی است.
هر یک از شش ماه اول تقویم فارسی ۳۱ روز ، هر پنج ماه بعدی ۳۰ روز و ماه آخر ۲۹ روز در یک سال مشترک و ۳۰ روز در یک سال کبیسه دارد. سال کبیسه سالی است که وقتی بر ۳۳ تقسیم شود ، باقیمانده ۱ ، ۵ ، ۹ ، ۱۳ ، ۱۷ ، ۲۲ ، ۲۶ یا ۳۰ باقی می ماند. به عنوان مثال ، سال ۱۳۷۰ یک سال کبیسه است زیرا تقسیم آن بر ۳۳ باقیمانده ۱۷دارد. در هر چرخه ۳۳ ساله تقریباً هشت سال کبیسه وجود دارد.
مبدا تاریخ میلادی نزد مسیحیان، تولد حضرت عیسی مسیح (ع) است که اتفاقا در روز ۲۵ ماه دسامبر واقع شده یعنی یک هفته مانده به تحویل سال نو میلادی (همانگونه که مبدا تاریخ شمسی ما ایرانیان و سال‌های قمری: ۱۲ربیع الاول مصادف با هجرت پیامبر از مکه به مدینه است اما ابتدای سال، فروردین ماه در سال شمسی و محرم در ماه‌های قمری است).
در کشورهایی که از تقویم میلادی استفاده میکنند، سال نو معمولا در اول ژانویه برگزار می گردد.

حال به سراغ کدی کوتاه شده برای تبدیل تاریخ شمسی به میلادی می رویم:

۱
PersianCalendar pc = new PersianCalendar();
۲
            DateTime dt = new DateTime(1395,10,10,pc);

برای تبدیل تاریخ میلادی به شمسی نیز از کد زیر استفاده می کنیم.

PersianCalendar pc = new PersianCalendar();
۲
            DateTime dt = new DateTime(2017,5,5); // یا DateTime.Now
۳
            string PersianDate = string.Format("{0}/{1}/{2}",pc.GetYear(dt),pc.GetMonth(dt),pc.GetDayOfMonth(dt));

امیدواریم از این مقاله نهایت استفاده را ببرید.