我目前有一个需要支持多种文化的应用程序。正在传入日期字符串并将其解析为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会出现问题。如果传入了错误的格式,则datestring无法正确解析。
以下显示了.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
对于FR-CA:
DateTime.Parse("26/08/2014") //EXCEPTION THROWN
DateTime.Parse("08/26/2014") //VALID
这与其他系统如何处理这种文化的日期格式有关。
为什么这些格式看似倒退? 这是.NET 4.5的错误吗?
感谢所有和所有帮助。
注意:.NET 4.5版
答案 0 :(得分:2)
您应该考虑Invariant
文化。这是您应该用于URL传递的内容。您可以在客户端上使用本地文化进行显示目的。
通常,无论何时存储数据(例如,在数据库或文件中),最好使用不变文化。显示数据时,您可以使用本地文化。传递数据时,您希望使用不变文化。
了解更多here。
答案 1 :(得分:2)
我相信你的假设是错误的。这个控制台应用程序:
static void Main(string[] args)
{
var enca = new CultureInfo("en-ca", false);
var frca = new CultureInfo("fr-ca", false);
Console.WriteLine("enca dd/MM/yyyy: " + ParseDate("26/08/2014", enca));
Console.WriteLine("enca MM/dd/yyyy: " + ParseDate("08/26/2014", enca));
Console.WriteLine("frca dd/MM/yyyy: " + ParseDate("26/08/2014", frca));
Console.WriteLine("frca MM/dd/yyyy: " + ParseDate("08/26/2014", frca));
Console.ReadKey();
}
static bool ParseDate(string date, CultureInfo culture)
{
try
{
DateTime.Parse(date, culture);
return true;
}
catch
{
return false;
}
}
有输出:
enca dd/MM/yyyy: False
enca MM/dd/yyyy: True
frca dd/MM/yyyy: False
frca MM/dd/yyyy: True
答案 2 :(得分:1)
加拿大文化的数据解析肯定存在错误。如果您尝试使用CurrentCulture =" en-CA":
DateTime.ParseExact("2014/09/20", "yyyy/MM/dd", Thread.CurrentThread.CurrentCulture)
您将获得以下异常:
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
如果您将 / 替换为其他内容(例如 - 或InvariantCulture),则可以正常工作。