我不确定我遇到的问题是因为缺乏对日期时间在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 预览值,它们会显示相同的“17/06/70 06:21:01ص”,但是,对象的实际值完全不同。
有人知道这是MS错误,还是因为我没有将正确的字符串值传递给 DateTime.TryParse 方法?
答案 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个字符串,并查看日期的哪些部分可以替换为当前日期的默认值/在运行时间。