如何将阿拉伯语 Umm Al-Qura 日期字符串解析为 .NET DateTime 对象?
How can I parse an Arabic Umm Al-Qura date string into a .NET DateTime object?
我想将 Umm Al-Qura 日历中的以下阿拉伯日期解析为 .NET DateTime 对象:
الأربعاء , 17 , 1436
这个日期相当于公历 2015 年 9 月 30 日。
我一直在尝试使用以下 "standard" 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
上的重载创建上面的确切日期字符串而不会出现问题。我显然不能反过来做。
这是一种从右到左的文化,这意味着 年 将首先呈现。例如下面的代码:
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:我不知道如何编写格式字符串来解析原始输入,因为改变了我看来像逗号的位置, 更改字符串中呈现的实际字符。
您的日期字符串长度为 30 个字符,包含四个 UNICODE 8207 U+200F
RIGHT TO LEFT MARK
字符,但您的日期格式没有。
// 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/
我想将 Umm Al-Qura 日历中的以下阿拉伯日期解析为 .NET DateTime 对象:
الأربعاء , 17 , 1436
这个日期相当于公历 2015 年 9 月 30 日。
我一直在尝试使用以下 "standard" 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
上的重载创建上面的确切日期字符串而不会出现问题。我显然不能反过来做。
这是一种从右到左的文化,这意味着 年 将首先呈现。例如下面的代码:
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:我不知道如何编写格式字符串来解析原始输入,因为改变了我看来像逗号的位置, 更改字符串中呈现的实际字符。
您的日期字符串长度为 30 个字符,包含四个 UNICODE 8207 U+200F
RIGHT TO LEFT MARK
字符,但您的日期格式没有。
// 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/