为什么DateTime.ParseExact()不能使用“M / d / yyyy”解析“9/1/2009”

时间:2009-09-02 16:07:49

标签: .net datetime parsing cultureinfo

我有一个看起来像这样的字符串:“9/1/2009”。我想将它转换为DateTime对象(使用C#)。

这有效:

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

但我不明白为什么这不起作用:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

日期中没有单词(比如“九月”),我知道具体的格式,所以我宁愿使用ParseExact(我不明白为什么需要CultureInfo)。但我继续得到可怕的“字符串未被识别为有效的DateTime”例外。

由于

稍加跟进。以下是3种有效的方法:

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

这里有3个不起作用:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

所以,Parse()适用于“en-US”,但不适用于ParseExact ......意外?

7 个答案:

答案 0 :(得分:91)

我怀疑问题是格式字符串中的斜杠与数据中的斜杠。这是格式字符串中对文化敏感的日期分隔符,最终参数为null表示“使用当前文化”。如果你 转义斜杠(“M'/'d'/'yyyy”)你指定CultureInfo.InvariantCulture,那就没关系。

如果有人有兴趣再现这个:

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
                                  new CultureInfo("de-DE"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("en-US"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  CultureInfo.InvariantCulture);

// Fails
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("de-DE"));

答案 1 :(得分:3)

我敢打赌你的机器文化不是“en-US”。来自the documentation

  

如果 provider 是空引用(在Visual Basic中为Nothing),则使用当前区域性。

如果您当前的文化不是“en-US”,这可以解释为什么它对我有用但不适合您在您明确指定文化为“en- US”。

答案 2 :(得分:2)

尝试

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))

答案 3 :(得分:0)

试试这个

provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);

再见。

答案 4 :(得分:-1)

我在XP上尝试了它,如果将PC设置为国际时间yyyy-M-d则无效。在行上放置一个断点,在处理之前更改日期字符串以使用' - '代替'/',你会发现它有效。无论您是否拥有CultureInfo都没有区别。 似乎很奇怪,只能指定一个经过验证的格式才能忽略分隔符。

答案 5 :(得分:-2)

尝试:

在网络配置文件中配置

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

例如:DateTime dt = DateTime.ParseExact(&#34; 08/21/2013&#34;,&#34; MM / dd / yyyy&#34;,null);

参考网址:http://support.microsoft.com/kb/306162/

答案 6 :(得分:-3)

将DateTimePicker Format属性设置为自定义,将CustomFormat属性设置为M/dd/yyyy