اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
برای تبدیل تاریخ میلادی به شمسی راههای زیادی وجود داره که خوب این هم یک نوع از اونها هست.
برای این کار با استفاده از Extension Method برای کلاس DateTime تاریخ رو تبدیل میکنیم.
برای فرمتهایهای نمایشی تاریخ هم میبایست به صورت متن به Method بدهید تا تاریخ رو به اون صورتی که میخواهید نمایش بدهد، برای نوشتن فرمتها هم میتوانید از این لینک استفاده کنید.
خوب برای این کار ابتدا یک کلاس با نام PersianDateExtensionMethods بسازید و تمام کد زیر رو جایگزین کدهای کلاس کنید:
using System; using System.Globalization; using System.Reflection; namespace System { public static class PersianDateExtensionMethods { private static CultureInfo _Culture; public static CultureInfo GetPersianCulture() { if (_Culture == null) { _Culture = new CultureInfo("fa-IR"); DateTimeFormatInfo formatInfo = _Culture.DateTimeFormat; formatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" }; formatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" }; var monthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" }; formatInfo.AbbreviatedMonthNames = formatInfo.MonthNames = formatInfo.MonthGenitiveNames = formatInfo.AbbreviatedMonthGenitiveNames = monthNames; formatInfo.AMDesignator = "ق.ظ"; formatInfo.PMDesignator = "ب.ظ"; formatInfo.ShortDatePattern = "yyyy/MM/dd"; formatInfo.LongDatePattern = "dddd, dd MMMM,yyyy"; formatInfo.FirstDayOfWeek = DayOfWeek.Saturday; System.Globalization.Calendar cal = new PersianCalendar(); FieldInfo fieldInfo = _Culture.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldInfo != null) fieldInfo.SetValue(_Culture, cal); FieldInfo info = formatInfo.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance); if (info != null) info.SetValue(formatInfo, cal); _Culture.NumberFormat.NumberDecimalSeparator = "/"; _Culture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational; _Culture.NumberFormat.NumberNegativePattern = 0; } return _Culture; } public static string ToPeString(this DateTime date,string format = "yyyy/MM/dd") { return date.ToString(format,GetPersianCulture()); } } }
در کد بالا ما بااستفاده از متد GetPersianCulture یک کالچر برای تاریخ شمسی و فرمتهای اون میسازیم و در متد ToPeString از اون استفاده و به متد ToString از کلاس DateTime پاس میدهیم.
چند مثال هم برای استفاده از متد ToPeString :
var date1 = DateTime.Now.ToPeString("yyyy/MM/dd"); var date2 = DateTime.Now.ToPeString("dddd, dd MMMM,yyyy"); //Output: //1391/12/13 //یکشنبه, 13 اسفند,1391
نکته : با استفاده از Culture ای که در کلاس بالا در متد GetPersianCulture ساخته میشود امکانش هست که خود کلاس DateTime رو به شمسی تبدیل کرد، برای این کار باید به صورت زیر عمل کرد:
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = PersianDateExtensionMethods.GetPersianCulture(); var d1 = DateTime.Now.ToString(); //Output : 1391/12/13 11:25:44 ب.ظ
یک نکتهی تکمیلی: کتابخانهی «DNTPersianUtils.Core» به همراه نکات این مطلب است؛ مانند:
Thread.CurrentThread.CurrentCulture = PersianCulture.Instance;