2 回答

TA貢獻1898條經(jīng)驗 獲得超8個贊
根據(jù) Rasool Aghajani 的回答,我實現(xiàn)了一個新的 CultureInfo 類,您可以將其設置為應用程序的默認文化,并且所有日期時間都將采用波斯文化格式。
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;
}
}
}

TA貢獻1794條經(jīng)驗 獲得超8個贊
我確實用這個替換了我的舊代碼:
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-Ir");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "?", "?", "?", "?", "?", "?", "?" };
info.DayNames = new string[] { "??????", "??????", "??????", "????????", "???????", "????", "????" };
info.AbbreviatedMonthNames = new string[] { "???????", "????????", "?????", "???", "?????", "??????", "???", "????", "???", "??", "????", "?????", "" };
info.MonthNames = new string[] { "???????", "????????", "?????", "???", "?????", "??????", "???", "????", "???", "??", "????", "?????", "" };
info.AMDesignator = "?.?";
info.PMDesignator = "?.?";
info.ShortDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
var field = typeof(System.Globalization.DateTimeFormatInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
field?.SetValue(info, cal);
var fieldInfo = typeof(System.Globalization.DateTimeFormatInfo).GetField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (fieldInfo != null)
{
object obj = fieldInfo.GetValue(info);
var methodInfo = obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (
methodInfo !=
null)
{
var propertyInfo = cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (
propertyInfo !=
null)
methodInfo.Invoke(obj, new object[] { propertyInfo.GetValue(cal, null) });
}
}
var field1 = typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
field1?.SetValue(calture, cal);
var fieldInfo1 = typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
fieldInfo1?.SetValue(calture, cal);
System.Threading.Thread.CurrentThread.CurrentCulture = calture;
System.Threading.Thread.CurrentThread.CurrentUICulture = calture;
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat = info;
它在所有計算機上都工作得很好......但我不知道......如果某些代碼是真的應該在所有計算機上工作!否則如果有問題不應該在任何計算機上工作......
- 2 回答
- 0 關注
- 82 瀏覽
添加回答
舉報