Как использовать DateTime.TryParse() для неанглийских языков, таких как арабский?
Мне нужно преобразовать строки в объекты 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 ответа
Если вы знаете точный формат, вы можете принудительно использовать его 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);
DateTime result = DateTime.Parse("الاربعاء 16 مارس 2011", new CultureInfo("ar-JO"));
Но вы можете проверить документацию: CultureInfo Class
Может быть что-то вроде этого:
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;
}
}
}
}
если вы собираетесь поддерживать несколько календарей:
Вы должны добавить все календари месяцев по порядку в этом массиве.
после декабря должны быть следующие календарные месяцы (раби-ол-аввал, раби-ол-тани, ...)
затем
int CalendarId = Месяц / 12;
Месяц%= 12;