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

Jim*_*mmy 56 .net datetime parsing cultureinfo

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

这有效:

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)

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

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
Run Code Online (Sandbox Code Playgroud)

日期中没有单词(如"九月"),我知道具体的格式,所以我宁愿使用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"));
Run Code Online (Sandbox Code Playgroud)

这里有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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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"));
Run Code Online (Sandbox Code Playgroud)