1

我不确定我遇到的问题是因为对 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

如果同时查看dt1dt2预览值,它们看起来是相同的“17/06/70 06:21:01 ص”,但是对象的实际值完全不同。

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

4

1 回答 1

1

要确保捕获完整日期,请尝试使用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)查看在运行时可以用当前日期/时间的默认值替换日期的哪一部分。

于 2016-06-27T15:45:04.687 回答