Based on Rasool Aghajani's answer, I've implemented a new CultureInfo class that you can set as the default culture of your application and all the date times will be in Persian culture format.
using System;
using System.Globalization;
using System.Reflection;
namespace SomeNamespace
{
public class PersianCulture : CultureInfo
{
public PersianCulture() : base("fa-IR")
{
if (this.Calendar is PersianCalendar)
return;
//do hack here to set the default culture's calendar to PersianCalender on OS versions that are not supporting PersianCalendar as default culture calendar
var dateTimeFormat = this.DateTimeFormat;
dateTimeFormat.AMDesignator = "قبلازظهر";
dateTimeFormat.AbbreviatedDayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
dateTimeFormat.AbbreviatedMonthGenitiveNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstDay;
dateTimeFormat.DateSeparator = "/";
dateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
dateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;
dateTimeFormat.FullDateTimePattern = "yyyy MMMM d, dddd H:mm:ss";
dateTimeFormat.LongDatePattern = "yyyy MMMM d, dddd";
dateTimeFormat.LongTimePattern = "H:mm:ss";
dateTimeFormat.MonthDayPattern = "MMMM d";
dateTimeFormat.MonthGenitiveNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.PMDesignator = "بعدازظهر";
dateTimeFormat.ShortDatePattern = "yyyy/M/d";
dateTimeFormat.ShortTimePattern = "H:mm";
dateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
dateTimeFormat.TimeSeparator = ":";
dateTimeFormat.YearMonthPattern = "yyyy MMMM";
var persianCalendar = new PersianCalendar();
var dateTimeFormatInfoCalendar = typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
dateTimeFormatInfoCalendar?.SetValue(dateTimeFormat, persianCalendar);
var cultureTableRecord = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
if (cultureTableRecord != null)
{
var dateTimeFormatValue = cultureTableRecord.GetValue(dateTimeFormat);
var useCurrentCalendarMethodInfo = dateTimeFormatValue.GetType().GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (
useCurrentCalendarMethodInfo !=
null)
{
var persianCalendarIdPropertyInfo = persianCalendar.GetType().GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
if (
persianCalendarIdPropertyInfo !=
null)
useCurrentCalendarMethodInfo.Invoke(dateTimeFormatValue, new object[] { persianCalendarIdPropertyInfo.GetValue(persianCalendar, null) });
}
}
var cultureCalendar = typeof(CultureInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
cultureCalendar?.SetValue(this, persianCalendar);
this.DateTimeFormat = dateTimeFormat;
}
}
}