2016-01-12 4 views
3

Я столкнулся с проблемой синтаксического анализа даты, программа была сбита арабскими датами. По какой-то причине DateTime.TryParse() выводит мусор для этой культуры. Вот пример кода, который иллюстрирует мою проблему:Анализ арабского языка на C#?

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 Я указываю точный формат, и он по-прежнему не может правильно разобрать. Я не могу понять, почему это происходит.

+1

По умолчанию время культуры арабской культуры не используется по григорианскому календарю IMO. Какова ценность для 'culture.Calendar'? – Irshad

+0

@Irshad: Возможно, вы захотите добавить это как ответ, с немного дополнительной информацией ... –

+0

@JonSkeet Спасибо. Добавлено – Irshad

ответ

3

Третий на самом деле не арабский. это культура, нечувствительная к культуре, которую можно всегда использовать в любом приложении .NET. Именно поэтому он возвращает текущее значение datetime в TryParseExact. Refer

Арабская культура не использует григорианский календарь для своего календаря по умолчанию. Он использует Лунный календарь (UmAlQuraCalendar). Таким образом, ваша дата считается лунной датой и переводится обратно в григорианскую.

+0

А, спасибо, это имеет смысл. Я не знал, что CultureInfo может указывать разные календари. –

2

Irshads' answer совершенно правильно, я просто хочу, чтобы получить более глубокий, если вы, ребята, дайте мне ..

ar культура использует UmAlQuraCalendar как .Calendar свойство не GregorianCalendar.

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

enter image description here

Это означает, что, когда вы разбираете вашу строку в первые два примера, ваш 16 в interpated, как 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, не было бы разговора, и он печатает точно, что это за значения.

Смежные вопросы