如何对非阿拉伯语等非英语语言使用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); 

我错过了什么?

如果您知道确切的格式,可以使用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); 
 DateTime result = DateTime.Parse("الاربعاء 16 مارس 2011", new CultureInfo("ar-JO")); 

但您可以查看文档: CultureInfo类

也许是这样的:

 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;