1

我在我的 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”日历来解析日期?

4

0 回答 0