2011-03-16 134 views
7

我需要将字符串转换为使用非英语语言的DateTime对象。我见过很多将DateTime转换为其他语言字符串的例子,但是没有其他方法。如何将DateTime.TryParse()用于阿拉伯语等非英语语言?

这似乎并不工作:

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); 

我错过了什么?

+0

我认为有一个阿拉伯语unicode规范化(或类似的)的小问题...我认为单词“wednesday”可以用两种方式编写...如果您尝试expected.ToString(“ddd dd MMMM yyyy “,provider)你会看到字符串看起来是一样的,但不是二进制相等的。你的第二个字符是0x0627(阿拉伯字母ALEF),ToString一个是0x0623(阿拉伯字母ALEF WITH HAMZA ABOVE)。我不知道阿拉伯的任何东西,但我希望这会帮助你。 – xanatos 2011-03-16 23:10:55

回答

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); 
+0

我也没有阅读阿拉伯文,结果表明这些文字是星期几和星期几等。一旦我指定了一个格式字符串,它的效果相当好。谢谢! – 2011-04-14 19:52:22

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

但是你可以查看文档:CultureInfo Class

+0

尽管我们搬到了约旦,但这并没有在我的机器上工作? – 2011-03-16 20:03:24

+0

刚试过你的例子,得到了这个:“该字符串没有被识别为有效的DateTime。有一个未知的单词从索引0开始。”我从字面上复制/粘贴你的例子。是什么赋予了? – 2011-03-16 20:18:21

+0

你知道你会使用哪种语言吗? – malinois 2011-03-16 20:21:42

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; 
      } 
     } 
    } 
} 

如果您要支持多个日历:
就必须加入所有的日历月份以在那个阵列中。
12月以后应该有下一个日历月(拉比醇-avval,拉比醇萨尼,...)
然后

INT CalendarId =月/ 12;
月份%= 12;

相关问题