.NET - 加拿大日期时间格式错误

时间:2014-08-22 17:35:07

标签: c# .net datetime culture

我目前有一个需要支持多种文化的应用程序。正在传入日期字符串并将其解析为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版

3 个答案:

答案 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),则可以正常工作。