阿拉伯文化日期时间解析不返回预期值

Arabic culture datetime parsing not returning expected values

我不确定我遇到的问题是因为不了解日期时间在 Umm al-Qura 日历中的工作原理,还是一个错误。

基本上,我正在编写测试以确保内部实用程序 class 正确解析值,而不管当前的文化如何。

在下面的代码中,目标是让 dt1 等于 dt2.

    public void ArabicTesting()
    {
        CultureInfo culture = new CultureInfo("ar");

        // Initialize a new datetime (04/01/2048 06:21:01 AM)
        DateTime dt1 = new DateTime(2048, 4, 1, 6, 21, 1);

        // Convert the datetime to a string using arabic cultureinfo
        // string ends up being "17/06/70 06:21:01 ص,"
        string dt2_string = $"{dt1.ToString(culture.DateTimeFormat.ShortDatePattern)} {dt1.ToString(culture.DateTimeFormat.LongTimePattern)}";

        // Parse the string
        DateTime dt2;
        DateTime.TryParse(dt2_string, culture, DateTimeStyles.None, out dt2);
    }

问题是 DateTime.TryParse 将日期时间作为字符串解析为看起来相同但值与预期不同的日期时间。

下面是一些正在发生的事情的屏幕截图:

如果您同时查看 dt1dt2 预览值,它们显示相同的“17/06/70 06:21:01 õ," 但是,对象的实际值完全不同。

有谁知道这是 MS 错误,还是因为我没有将正确的字符串值传递给 DateTime.TryParse 方法?

要确保捕获完整日期,请尝试使用 LongDatePattern 而不是 ShortDatePattern

string dt2_string = $"{dt1.ToString(culture.DateTimeFormat.LongDatePattern)} {dt1.ToString(culture.DateTimeFormat.LongTimePattern)}";

基于此,2 的结果可能会有所不同,因为 ShortDatePattern 可能会省略一个日期部分,该日期部分可能会在解析方法中错误地采用默认值,例如全年(示例)。假定或不假定的部分取决于所使用的文化,某些文化可能以任何一种方式工作,而其他文化则有问题(如阿拉伯语)。

为了更好地调试为什么在这种特殊情况下会发生这种情况,您可以比较 dt1.ToString(culture.DateTimeFormat.LongDatePattern)dt1.ToString(culture.DateTimeFormat.ShortDatePattern) 中的 2 个字符串,看看日期的哪一部分可以替换为当前日期的默认值date/time 在 运行 时间。