C# - 如何在不更改 DateTime 格式的情况下更改区域性
C# - How to change culture without changing DateTime format
我曾在ASP,net Web Form 中使用过Resx 文件在站点中实现多语言。
要更改语言,我应该更改以下措施:
Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentUICulture
似乎在 Microsoft Windows10 等新操作系统中,更改 Culture 可能会以相同的方式更改 DateTime。
这给我们带来了很多问题
例如:DateTime 在数据库中的保存格式是 Anno Domini 但它会通过更改 Culture 并以其他格式保存在数据库中进行更改。
如何在不更改日期格式的情况下更改文化?
谢谢
您应该使用 CultureInfo class 实现自定义区域性,并从默认或自己的区域性派生日期时间模式:
public static class PersianDateExtensionMethods
{
private static CultureInfo _culture;
public static CultureInfo GetPersianCulture()
{
const string cultureName = "fa-IR";
if (_culture == null)
{
_culture = new CultureInfo(cultureName);
DateTimeFormatInfo formatInfo = _culture.DateTimeFormat;
formatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
formatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" };
var monthNames = new[]
{
"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن",
"اسفند",
""
};
formatInfo.AbbreviatedMonthNames = formatInfo.MonthNames = formatInfo.MonthGenitiveNames = formatInfo.AbbreviatedMonthGenitiveNames = monthNames;
_culture.DateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
Calendar persianCalendar = new PersianCalendar();
FieldInfo fieldInfo = _culture.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo != null)
fieldInfo.SetValue(_culture, persianCalendar);
FieldInfo info = formatInfo.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (info != null)
info.SetValue(formatInfo, persianCalendar);
_culture.NumberFormat.NumberDecimalSeparator = "/";
_culture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
_culture.NumberFormat.NumberNegativePattern = 0;
}
return _culture;
}
}
正如您在我们的自定义文化的代码 DateTimeFormat 中看到的那样,设置为 "en-US" 文化的日期时间格式,最后 _culture 变量包含一个新的波斯语文化,但日期时间格式继承自美国文化。
您需要像这样配置服务以使用您的文化:
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture =
PersianDateExtensionMethods.GetPersianCulture();
我不知道您的问题出在哪里,需要根据您的要求更改代码,但我希望这段代码能给您解决问题的思路。
我将以下代码添加到母版页的 OnLoad 中以防止使用其他文化日历
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat = New CultureInfo("en-GB").DateTimeFormat
我曾在ASP,net Web Form 中使用过Resx 文件在站点中实现多语言。 要更改语言,我应该更改以下措施:
Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentUICulture
似乎在 Microsoft Windows10 等新操作系统中,更改 Culture 可能会以相同的方式更改 DateTime。 这给我们带来了很多问题 例如:DateTime 在数据库中的保存格式是 Anno Domini 但它会通过更改 Culture 并以其他格式保存在数据库中进行更改。 如何在不更改日期格式的情况下更改文化?
谢谢
您应该使用 CultureInfo class 实现自定义区域性,并从默认或自己的区域性派生日期时间模式:
public static class PersianDateExtensionMethods
{
private static CultureInfo _culture;
public static CultureInfo GetPersianCulture()
{
const string cultureName = "fa-IR";
if (_culture == null)
{
_culture = new CultureInfo(cultureName);
DateTimeFormatInfo formatInfo = _culture.DateTimeFormat;
formatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
formatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" };
var monthNames = new[]
{
"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن",
"اسفند",
""
};
formatInfo.AbbreviatedMonthNames = formatInfo.MonthNames = formatInfo.MonthGenitiveNames = formatInfo.AbbreviatedMonthGenitiveNames = monthNames;
_culture.DateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
Calendar persianCalendar = new PersianCalendar();
FieldInfo fieldInfo = _culture.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo != null)
fieldInfo.SetValue(_culture, persianCalendar);
FieldInfo info = formatInfo.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (info != null)
info.SetValue(formatInfo, persianCalendar);
_culture.NumberFormat.NumberDecimalSeparator = "/";
_culture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
_culture.NumberFormat.NumberNegativePattern = 0;
}
return _culture;
}
}
正如您在我们的自定义文化的代码 DateTimeFormat 中看到的那样,设置为 "en-US" 文化的日期时间格式,最后 _culture 变量包含一个新的波斯语文化,但日期时间格式继承自美国文化。
您需要像这样配置服务以使用您的文化:
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture =
PersianDateExtensionMethods.GetPersianCulture();
我不知道您的问题出在哪里,需要根据您的要求更改代码,但我希望这段代码能给您解决问题的思路。
我将以下代码添加到母版页的 OnLoad 中以防止使用其他文化日历
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat = New CultureInfo("en-GB").DateTimeFormat