用C#解析阿拉伯语日期?

时间:2016-01-12 11:16:36

标签: c# datetime

我遇到了解析日期的问题,该程序被阿拉伯语日期绊倒了。由于某种原因,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中我指定了确切的格式,但仍然无法正确解析。我无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:4)

第三个实际上不是阿拉伯语。它是一种对文化不敏感的文化,可以在任何.NET应用程序中使用。这就是为什么它会在TryParseExact中返回当前日期时间值的原因。 Refer

阿拉伯文化不使用阳历来表示它的默认日历。它使用农历(UmAlQuraCalendar)。因此,您的日期被视为农历日期并转换回格里高利。

答案 1 :(得分:2)

Irshads'answer是完全正确的,如果你们让我的话,我只想变得更深......

ar种群使用UmAlQuraCalendar作为.Calendar属性而非GregorianCalendar

CultureInfo.GetCultureInfo("ar").Calendar.Dump();

enter image description here

这意味着,当您在前两个示例中解析字符串时,您的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,因此不会进行任何对话,并且会准确打印出它的值。