我遇到了解析日期的问题,该程序被阿拉伯语日期绊倒了。由于某种原因,DateTime.TryParse()
输出了这种文化的垃圾。以下示例代码说明了我的问题:
var culture = CultureInfo.CreateSpecificCulture("ar");
DateTime date;
if (DateTime.TryParse(
"15/01/16",
culture,
DateTimeStyles.None,
out date))
{
Console.WriteLine("TryParse with Arabic culture: " + date);
}
if (DateTime.TryParseExact(
"15/01/16",
culture.DateTimeFormat.ShortDatePattern, // dd/MM/yy
culture,
DateTimeStyles.None,
out date))
{
Console.WriteLine("TryParseExact with Arabic short date pattern and culture: " + date);
}
if (DateTime.TryParseExact(
"15/01/16",
culture.DateTimeFormat.ShortDatePattern, // dd/MM/yy
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date))
{
Console.WriteLine("TryParseExact with Arabic short date pattern and invariant culture: " + date);
}
输出是这样的:
TryParse with Arabic culture: 1995-06-13 00:00:00
TryParseExact with Arabic short date pattern and culture: 1995-06-13 00:00:00
TryParseExact with Arabic short date pattern and invariant culture: 2016-01-15 00:00:00
只有最后一个版本有效,我无法弄清楚前两个版本失败的原因。我能理解TryParse
失败,因为它无法弄清楚要使用哪种模式;但是在TryParseExact
中我指定了确切的格式,但仍然无法正确解析。我无法弄清楚为什么会这样。
答案 0 :(得分:4)
第三个实际上不是阿拉伯语。它是一种对文化不敏感的文化,可以在任何.NET应用程序中使用。这就是为什么它会在TryParseExact
中返回当前日期时间值的原因。 Refer
阿拉伯文化不使用阳历来表示它的默认日历。它使用农历(UmAlQuraCalendar)。因此,您的日期被视为农历日期并转换回格里高利。
答案 1 :(得分:2)
Irshads'answer是完全正确的,如果你们让我的话,我只想变得更深......
ar
种群使用UmAlQuraCalendar
作为.Calendar
属性而非GregorianCalendar
。
CultureInfo.GetCultureInfo("ar").Calendar.Dump();
这意味着,当您在前两个示例中解析字符串时,您的16
被视为1416
,因为此UmAlQuraCalendar
使用1451
作为TwoDigitYearMax
property
由于此UmAlQuraCalendar
类几乎与HijriCalendar
类完全相同,因此该链接http://www.islamicfinder.org/dateConversion.php?mode=hij-ger&day=15&month=1&year=1416&date_result=1
此15/01/1416
转换为14/06/1995
,但也说明了
*一天错误的可能性很小。
所以我认为太正常,因此看到1995-06-13
。
但在第三个示例中,由于InvariantCulture
使用GregorianCalendar
,因此不会进行任何对话,并且会准确打印出它的值。