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

本文关键字:net 对象 DateTime 字符串 日期 阿拉伯语 Umm Al-Qura | 更新日期: 2023-09-27 18:15:08

我在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上的重载来创建上面的确切日期字符串,而不会出现问题。显然我不能反过来做

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

您的datestring是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:我不知道如何编写格式字符串来解析原始输入,因为改变在我看来像逗号的位置,会改变字符串中呈现的实际字符。