如何将阿拉伯语Umm Al-Qura日期字符串解析为.NET DateTime对象?

我在Umm Al-Qura日历中有以下阿拉伯语日期,我要解析为.NET DateTime对象:

الأربعاء,17ذوالحجة,1436

该日期相当于格里高利历中的2015年9月30日。

我一直在尝试使用以下“标准”C#代码来解析这个日期,但没有成功:

var cultureInfo = new CultureInfo("ar-SA"); cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // the default one anyway var dateFormat = "dddd، dd MMMM، yyyy"; //note the ، instead of , var dateString = "‏الأربعاء‏، 17‏ ذو الحجة‏، 1436"; DateTime date; DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out date); 

无论我做什么, TryParseExact的结果总是false 。 如何在.NET中正确解析此字符串?

顺便说一句,如果我从DateTime对象开始,我可以使用ToString()DateTime上的重载创建上面的确切日期字符串而不会出现问题。 我显然不能以相反的方式做到这一点。

您的日期字符串长度为30个字符,包含四个UNICODE 8207 U+200F RIGHT TO LEFT MARK字符,但您的dateformat不包含。

 // This gives a string 26 characters long var str = new DateTime(2015,9,30).ToString(dateFormat, cultureInfo.DateTimeFormat) 

RIGHT TO LEFT MARK的权利不是空白。

如果它只包含RLM / LRM / ALM,你可能应该将它们剥离出去。 与分离株LRI / RLI / FSI和PDI组以及LRE / RLE组相同。 你可能不想对LRO那样做。 LRO通常与遗留数据一起使用,其中RTL字符以相反的顺序存储,即以从左到右的顺序存储。 在这些情况下,您可能希望实际反转字符。

从随机地点解析日期是一个难题。 您需要一个分层解决方案,先尝试一种方法,然后按优先级顺序尝试另一种方法,直到成功 但是,没有100%的解决方案,因为人们可以输入他们喜欢的内容。

有关更多信息,请参见此处: http : //www.unicode.org/reports/tr9/

这是一种从右到左的文化,这意味着将首先呈现年份 。 例如,以下代码:

 var cultureInfo = new CultureInfo("ar-SA"); cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); Console.WriteLine(String.Format(cultureInfo,"{0:dddd، dd MMMM، yyyy}",DateTime.Now)); 

生产الأربعاء، 17 ذو الحجة، 1436 。 解析此字符串可以正常工作:

 var dateString="الأربعاء، 17 ذو الحجة، 1436"; var result=DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces,out date); Debug.Assert(result); 

PS:我不知道如何编写格式字符串来解析原始输入,因为更改看起来像逗号的位置,会更改字符串中呈现的实际字符。