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

时间:2016-06-27 15:31:48

标签: c# datetime culture tryparse arabic-support

我不确定我遇到的问题是因为缺乏对日期时间在Umm al-Qura日历中的工作方式的理解,或者是否是一个错误。

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

在下面的代码中,目标是让 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 将日期时间解析为字符串,显示为相同的日期时间,但其值与预期的值不同。

以下是一些正在发生的事情的截图:

dt1 dt2

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

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

1 个答案:

答案 0 :(得分:1)

要确保捕获完整日期,请尝试使用LongDatePattern代替ShortDatePattern

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

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

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