将US dateformat解析为加拿大dateformat会抛出“String未被识别为有效的DateTime”

时间:2014-03-17 15:58:08

标签: c#

我继承了一个用于SSIS的自定义DLL代码,但我不是C#精明。即使日期时间设置相同,用于在Win 2003机器上工作的代码也不再在2012年工作

这是一个非常简单的例子

DateTime aa;

 try
 {
System.IFormatProvider format = new System.Globalization.CultureInfo("en-CA", true);
aa = System.DateTime.ParseExact("02/09/2014", "MM/dd/yyyy",format,System.Globalization.DateTimeStyles.AllowWhiteSpaces);
 }
  

$ exception {" String未被识别为有效的DateTime。"} System.Exception {System.FormatException}

如果我将格式更改为" en-GB"或者" it-IT" ,它可以工作,但我需要解析美国日期格式为加拿大。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

这不起作用的原因:

System.IFormatProvider format = new System.Globalization.CultureInfo("en-CA", true);
var aa = System.DateTime.ParseExact("2014/02/09", "yyyy/MM/dd", format);

是因为加拿大的日期分隔符字符为'-',但日期字符串中的日期分隔符为'/'。因此,它失败了。

您可以通过更改日期格式说明符来修复此问题,以通过转义斜杠来使用显式分隔符,如下所示:

var aa = System.DateTime.ParseExact("2014/02/09", "yyyy\\/MM\\/dd", format);

可替换地:

var aa = System.DateTime.ParseExact("2014/02/09", @"yyyy\/MM\/dd", format);

请注意,仅将'/'字符放入日期格式规范并不意味着"此处应该有'/'个字符"。这意味着"此处应该有一个日期分隔符",以及日期分隔符所依据的字符取决于区域设置。

因为您指定了加拿大,'\'说明符实际上被解释为意味着那里应该有一个'-'字符。

要覆盖此行为,您可以指定\\/,而不是按照上面的示例,这会告诉解析器将/逐字处理,而不是将其视为指定区域设置的日期分隔符

我还应该提到你也可以使用" InvariantCulture",这也可以,因为InvariantCulture中的日期分隔符总是'/'