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

Dan*_*iff 7 c# globalization datetime parsing

我需要将字符串转换为非英语语言的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);
Run Code Online (Sandbox Code Playgroud)

另外,我需要处理其他日历中的字符串.这是我尝试过的,它似乎也没有用.

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);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Mor*_*gil 3

如果您知道确切的格式,您可以通过以下方式强制使用它TryParseExact

\n\n
b = DateTime.TryParseExact(sample, "dddd d MMMM yyyy", provider, DateTimeStyles.None, out result);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,就您的情况而言,这不起作用。要找到问题,让\xe2\x80\x99s 尝试相反的方法:

\n\n
Console.WriteLine(expected.ToString("dddd d MMMM yyyy", provider));\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是 \xe2\x80\x9c\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xa8\xd8\xb9\xd8\xa7\xd8\xa1 16 \xd9\x85\xd8\ xa7\xd8\xb1\xd8\xb3 2011\xe2\x80\x9d,它(你可能比我读得更好)与你的输入有一个字符不同:.NET 使用(并期望)hamza,你的输入没有它。如果我们以这种方式修改输入,一切都会正常:

\n\n
CultureInfo provider = new CultureInfo("ar-AE");    // Arabic - United Arab Emirates\n\nstring sample = "\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xa8\xd8\xb9\xd8\xa7\xd8\xa1 16 \xd9\x85\xd8\xa7\xd8\xb1\xd8\xb3 2011"; // Arabic date in Gregorian calendar\nDateTime result;\nDateTime expected = new DateTime(2011, 3, 16);   // the expected date\nbool b;\n\nb = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result);\n\nAssert.IsTrue(b);\nAssert.AreEqual(expected, result);\n
Run Code Online (Sandbox Code Playgroud)\n