我在我的 Asp.Net Core 应用程序中使用全球化和本地化,当请求的文化设置为“fa-IR”时,我想使用 PersianCalendar。
这需要在发生时DateTime.ToString()
发生。我希望它自动转换为波斯日期,我不想更改调用 ToString() 方法的代码(因为其他文化仍然需要查看公历)。
请求本地化工作正常,并且CultureInfo.CurrentCulture
正确设置为“fa-IR”,但“fa-IR”文化的默认日历是GregorianCalendar
.
所以我创建了一个这样的子类CultureInfo
:
public class PersianCulture : CultureInfo
{
private readonly Calendar _calendar;
private readonly Calendar[] _optionalCalendars;
private DateTimeFormatInfo _dateTimeFormatInfo;
public PersianCulture() : base("fa-IR") {
_calendar = new PersianCalendar();
_optionalCalendars = new List<Calendar>
{
new PersianCalendar(),
new GregorianCalendar()
}.ToArray();
var dateTimeFormatInfo = CultureInfo.CreateSpecificCulture("fa-IR").DateTimeFormat;
dateTimeFormatInfo.Calendar = _calendar;
_dateTimeFormatInfo = dateTimeFormatInfo;
}
public override Calendar Calendar => _calendar;
public override Calendar[] OptionalCalendars => _optionalCalendars;
public override DateTimeFormatInfo DateTimeFormat {
get => _dateTimeFormatInfo;
set => _dateTimeFormatInfo = value;
}
}
然后我添加了一个中间件,检查请求的文化是否为“fa-IR”,然后将其CurrentCulture
设置为PersianCulture
如下:
if ( CultureInfo.CurrentCulture.Name == "fa-IR" ) {
var culture = new PersianCulture();
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
我得到了预期的结果。每当someDate.ToString()
调用 a 时,输出都会转换为波斯日期。例如DateTime.Now.ToString()
将输出16/10/1400 02:53:40 ب.ظ
.
问题是相同的Calendar
,并且在发生时DateTimeFormatInfo
使用DateTime.Parse()
并且解析的日期将是错误的,因为源是公历格式但被视为波斯语。
如何使用我的自定义PersianCulture
类转换为字符串并使用 C# 默认的“fa-IR”日历来解析日期?