我目前有一个应用程序,需要支持多种文化。传递了一个日期字符串,并将其解析为DateTime对象。为了允许多个文化,我首先设置线程的区域性和UICulture。
以下是我的代码示例:
首先,我为该线程设置文化。这是通过URL传递的(例如en-us、en-ca、fr-ca):
CultureInfo ci = new CultureInfo(culture, false);
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = ci;
然后,我取出URL中传递的日期字符串并将其转换为DateTime格式。根据文化背景,日期可能以mm/dd/yyyy或dd/mm/yyyy的形式传递。
以下是我解析日期字符串的代码:
DateTime DateTimeObject;
bool validDate = DateTime.TryParse(DateStringFromURL, Thread.CurrentThread.CurrentCulture, DateTimeStyles.None, out DateTimeObject);
TryParse 函数适用于大多数文化,并可输出有效的日期时间对象。但 en-ca 和 fr-ca 存在问题。如果传入错误的格式,则日期字符串将无法正确解析。
以下内容显示了 .NET 对每种文化似乎期望的格式:
dd/MM/yyyy MM/dd/yyyy
EN-CA Valid Invalid
FR-CA Invalid Valid
编辑:
为了更准确,以下是导致我问题的示例:
对于EN-CA:
DateTime.Parse("26/08/2014") //VALID
DateTime.Parse("08/26/2014") //EXCEPTION THROWN
对于加拿大法语:
DateTime.Parse("26/08/2014") //EXCEPTION THROWN
DateTime.Parse("08/26/2014") //VALID
其他系统处理这种文化的日期格式与此相反。
为什么格式看起来是反过来的?这是.NET 4.5的一个错误吗?
任何帮助都将不胜感激,谢谢。
注意:.NET版本为4.5
DateTime.TryParse
失败的日期字符串示例吗?可以使用具有特定格式或预定义格式组的DateTime.TryParseExact
。还有一件事,小写的mm
表示分钟,大写的MM
表示月份。 - Habib