C#-如何在不更改日期时间格式的情况下更改区域性
我曾在ASP、NETWeb表单中使用Resx文件在一个站点中实现多语言。 对于更改语言,我应更改以下度量:C#-如何在不更改日期时间格式的情况下更改区域性,c#,multilingual,cultureinfo,culture,C#,Multilingual,Cultureinfo,Culture,我曾在ASP、NETWeb表单中使用Resx文件在一个站点中实现多语言。 对于更改语言,我应更改以下度量: Thread.CurrentThread.CurrentCulture Thread.CurrentThread.CurrentUICulture 在新的操作系统中,如Microsoft Windows 10,改变区域性可能会以同样的方式改变日期时间。 这给我们带来了很多问题 例如:DateTime在数据库中的保存格式为Anno Domini,但它通过更改区域性而更改,并通过其他格式保存
Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentUICulture
在新的操作系统中,如Microsoft Windows 10,改变区域性可能会以同样的方式改变日期时间。
这给我们带来了很多问题
例如:DateTime在数据库中的保存格式为Anno Domini,但它通过更改区域性而更改,并通过其他格式保存在数据库中。
如何在不更改日期格式的情况下更改区域性
谢谢您应该使用类实现自定义区域性,并从默认区域性或自己的区域性派生日期时间模式:
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;
}
}
正如您在自定义区域性的code DateTimeFormat中所看到的,设置为“en US”区域性的日期时间格式,在结尾处_culture变量包含一个新的区域性,该区域性适用于波斯语,但日期时间格式继承自美国区域性
您需要配置服务以使用您的区域性,如下所示:
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture =
PersianDateExtensionMethods.GetPersianCulture();
我不知道你的问题在哪里,为你的需求修改代码,但我希望这段代码能给你一个解决问题的想法 我在已加载的母版页中添加了以下代码,以防止使用其他文化日历
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat = New CultureInfo("en-GB").DateTimeFormat
如果要将数据库中的日期时间保存为格式化字符串,则问题远大于此问题。@iakobski我真的不想这样做。我想将它们保存为数据时间。;]是否将数据库中的日期时间保存为字符串?或作为日期时间数据类型。如果您是数据类型,则区域性不会影响DateTime值。如果它是一个字符串,只需在每次保存/写入数据库之前格式化该字符串。这些方法对您有帮助吗?