如何对非阿拉伯语等非英语语言使用DateTime.TryParse()?

时间:2011-03-16 19:45:27

标签: c# parsing datetime globalization

我需要将字符串转换为非英语语言的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 个答案:

答案 0 :(得分:2)

DateTime result = DateTime.Parse("الاربعاء 16 مارس 2011", new CultureInfo("ar-JO"));

但您可以查看文档:{​​{3}}

答案 1 :(得分:2)

如果您知道确切的格式,可以强制使用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使用(并期望)hamza,你的输入没有它。如果我们以这种方式修改输入,一切正常:

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 :(得分:0)

可能是这样的:

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 = Month / 12;
月%= 12;