2016-06-27 10 views
1

Я не уверен, что проблема у меня возникает из-за недостаточного понимания того, как работает дата в календаре Umm al-Qura, или если это ошибка.Арабская культура datetime parsing не возвращает ожидаемые значения

В основном я работаю над написанием теста, чтобы убедиться, что внутренний класс утилиты правильно анализирует значения независимо от текущей культуры.

В коде ниже, цель состоит в том, чтобы иметь 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 является разбор DateTime в виде строки в DateTime, который появляется то же самое, но имеет различные значения, чем то, что, как ожидается.

Вот несколько скриншотов из того, что происходит:

dt1 dt2

Если вы посмотрите на обоих dt1 и dt2 значений предварительного просмотра, они выглядят так же «17/06/70 06:21:01 ص ", однако, фактические значения объектов совершенно разные.

Кто-нибудь знает, является ли это ошибкой MS, или это потому, что я не передаю правильное строковое значение в метод DateTime.TryParse?

+1

Что произойдет, если вы используете 'LongDatePattern' вместо' ShortDatePattern'? 'string dt2_string = $" {dt1.ToString (culture.DateTimeFormat.LongDatePattern)} {dt1.ToString (culture.DateTimeFormat.LongTimePattern)} ";' – Igor

+0

@Igor, который действительно работал для этого сценария - спасибо. Меня все еще немного беспокоит, мне кажется, что проблема по умолчанию для метода ToString для DateTime возвращает одинаковые значения для разных дат. Нельзя ли использовать образец коротких дат в арабских культурах, если это может произойти? – user2338408

ответ

1

Чтобы убедиться, что полная дата взята, используйте LongDatePattern вместо ShortDatePattern.

string dt2_string = $"{dt1.ToString(culture.DateTimeFormat.LongDatePattern)} {dt1.ToString(culture.DateTimeFormat.LongTimePattern)}"; 

Результаты 2 могут быть различными на этом основании, как ShortDatePattern может опустить DATEPART, которые затем могли иметь значение по умолчанию, можно ошибочно предположить, в методе синтаксического анализа, такие как полный год (пример). Какая часть или не предполагается, зависит от используемой культуры, и некоторые культуры, вероятно, работают в любом случае, в то время как другие будут иметь проблемы (например, арабский).

Чтобы лучше отладить, почему это произошло в этом конкретном случае, вы можете сравнить 2 строки от dt1.ToString(culture.DateTimeFormat.LongDatePattern) и dt1.ToString(culture.DateTimeFormat.ShortDatePattern) и посмотреть, какая часть даты может быть заменена значением по умолчанию от текущей даты/времени во время выполнения.

+0

Кажется противоречивым, что существует образец для написания дат, который может относиться к более чем одной дате, хотя я предполагаю, что они существуют и в английской культуре (например, 06/27/16) Если это так, Мне легко понять, почему эта проблема происходит сейчас. Это определенно хорошо знать, так что спасибо за помощь в этом! – user2338408

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

  • Нет связанных вопросов^_^