Как использовать DateTime.TryParse () для неанглийских языков, таких как арабский? - PullRequest
7 голосов
/ 16 марта 2011

Мне нужно преобразовать строки в объекты DateTime, которые не на английском языке. Я видел много примеров преобразования DateTime в строки на других языках, но не наоборот.

Это не похоже на работу:

CultureInfo provider = new CultureInfo("ar-AE");    // Arabic - United Arab Emirates

string sample = "الاربعاء 16 مارس 2011"; // Arabic date in Gregorian calendar
DateTime result;
DateTime expected = new DateTime(2011, 3, 16);   // the expected date
bool b;

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result);

Assert.IsTrue(b);
Assert.AreEqual(expected, result);

Кроме того, мне нужно обработать строки, которые есть в других календарях. Это то, что я пытался, и это тоже не сработало.

CultureInfo provider = new CultureInfo("ar-AE");    // Arabic - United Arab Emirates
provider.DateTimeFormat.Calendar = new System.Globalization.HijriCalendar();
// Wednesday, March 16, 2011, 11 Rabi second in 1432
string sample = " ‏11 ربيع ثاني 1432 ";
DateTime result;
DateTime expected = new DateTime(2011, 3, 16);   // ?
bool b;

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result);

Assert.IsTrue(b);
Assert.AreEqual(expected, result);

Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Если вам известен точный формат, вы можете принудительно использовать его с помощью TryParseExact:

b = DateTime.TryParseExact(sample, "dddd d MMMM yyyy", provider, DateTimeStyles.None, out result);

Однако в вашем случае это не работает.Чтобы найти проблему, давайте попробуем наоборот:

Console.WriteLine(expected.ToString("dddd d MMMM yyyy", provider));

И результат «الأربعاء 16 مارس 2011», который (вы, вероятно, читаете это лучше меня) отличается от вашего ввода одним символом: .NET использует (и ожидает) Хамза, ваш вклад не имеет его.Если мы изменим ввод таким образом, все будет работать:

CultureInfo provider = new CultureInfo("ar-AE");    // Arabic - United Arab Emirates

string sample = "الأربعاء 16 مارس 2011"; // Arabic date in Gregorian calendar
DateTime result;
DateTime expected = new DateTime(2011, 3, 16);   // the expected date
bool b;

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result);

Assert.IsTrue(b);
Assert.AreEqual(expected, result);
2 голосов
/ 16 марта 2011
DateTime result = DateTime.Parse("الاربعاء 16 مارس 2011", new CultureInfo("ar-JO"));

Но вы можете проверить документацию: CultureInfo Class

0 голосов
/ 19 марта 2011

может быть что-то вроде этого:

int Year, DayOfMonth;
string Month;
string[] Months = new string[] {"ينایر","فبرایر","مارس","ابریل","مایو",...};//these texts are writen with persian keyboard,change the ی  with ي ,its really hard with my keymap
string[] Splits = Input.Split(" ");
foreach(string Split in Splits)
{
    if(Months.Contains(Split))
    {
        Month = Months.IndexOf(Split);
    }
    else
    {
        int Number;
        if(int.TryParse(Split, out Number))
        {
            if(Number<32)
            {
                DayOfMonth=Number;
            }
            else
            {
                Year=Number;
            }
        }
    }
}

если вы собираетесь поддерживать несколько календарей:
вы должны добавить все календарные месяцы в порядке в этом массиве.
после декабря должно бытьследующие календарные месяцы (rabi-ol-avval, rabi-ol-thani, ...)
затем

int CalendarId = Месяц / 12;
Месяц% = 12;

...