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

کلاس 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):  " +
                          "{0}, {1}/{2}/{3} {4}:{5}:{6}\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):  " +
                          "{0}, {1}/{2}/{3} {4}:{5}:{6}\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
نکته
برای آشنایی بیشتر با ASP. Net Core، می توانید مقاله “ASP. Net Core چیست؟” را مطالعه فرمایید.

توضیحات

همانطور که می دانید تاریخ های تقویم فارسی از سال های هجری شروع می شود که مرتبط با سال 622 میلادی است و سالی است که حضرت محمد (ص) از مکه به مدینه مهاجرت کرد. به عنوان مثال ، تاریخ 21 مارس 2002 میلادی مطابق با اولین روز ماه فروردین سال 1381هجری شمسی است.
تقویم فارسی بر اساس یک سال شمسی می باشد و تقریباً 365 روز دارد. هر سال چهار فصل را طی می کند و وقتی خورشید از نیم کره جنوبی به نیم کره شمالی از مرکز زمین عبور می کند ، یک سال جدید آغاز می شود. سال جدید اولین روز فروردین ماه است که اولین روز بهار در نیم کره شمالی است.
هر یک از شش ماه اول تقویم فارسی 31 روز ، هر پنج ماه بعدی 30 روز و ماه آخر 29 روز در یک سال مشترک و 30 روز در یک سال کبیسه دارد. سال کبیسه سالی است که وقتی بر 33 تقسیم شود ، باقیمانده 1 ، 5 ، 9 ، 13 ، 17 ، 22 ، 26 یا 30 باقی می ماند. به عنوان مثال ، سال 1370 یک سال کبیسه است زیرا تقسیم آن بر 33 باقیمانده 17دارد. در هر چرخه 33 ساله تقریباً هشت سال کبیسه وجود دارد.
مبدا تاریخ میلادی نزد مسيحيان، تولد حضرت عيسي مسيح (ع) است كه اتفاقا در روز 25 ماه دسامبر واقع شده يعني يك هفته مانده به تحويل سال نو میلادی (همانگونه كه مبدا تاريخ شمسي ما ايرانيان و سال‌هاي قمري: 12ربيع الاول مصادف با هجرت پيامبر از مكه به مدينه است اما ابتداي سال، فروردين ماه در سال شمسي و محرم در ماه‌هاي قمري است).
در کشورهایی که از تقویم میلادی استفاده میکنند، سال نو معمولا در اول ژانویه برگزار می گردد.

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

1
PersianCalendar pc = new PersianCalendar();
2
            DateTime dt = new DateTime(1395,10,10,pc);

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

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

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