2011-03-16 201 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;

相關問題