我继承了一个用于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" ,它可以工作,但我需要解析美国日期格式为加拿大。
我错过了什么?
答案 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中的日期分隔符总是'/'
。