.net-为什么DateTime.ParseExact()无法使用“ M / d / yyyy”解析“ 9/1/2009”

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

这有效:

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

但是我不明白为什么这行不通:

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

日期中没有单词(例如“ September”),我知道具体的格式,所以我宁愿使用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一起使用...

Jimmy asked 2019-11-16T00:02:53Z
7个解决方案
91 votes

我怀疑问题是格式字符串中的斜杠与数据中的斜杠。 这是格式字符串中区分区域性的日期分隔符,最后一个参数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"));
Jon Skeet answered 2019-11-16T00:03:49Z
3 votes

我敢打赌您的机器文化不是“美国”。 从文档中:

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

如果您当前的文化不是“美国”,这将解释为什么它对我有用,但对您不起作用,并且当您明确指定文化为“美国”时也有效。

Lee answered 2019-11-16T00:04:26Z
2 votes

尝试

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))
Scott answered 2019-11-16T00:04:45Z
0 votes

试试这个

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

再见

RRUZ answered 2019-11-16T00:05:10Z
-1 votes

我在XP上尝试过,如果PC设置为国际时间yyyy-M-d,则无法使用。 在该行上放置一个断点,然后在处理该断点之前,将日期字符串更改为使用“-”代替“ /”,您会发现它可以工作。 是否具有CultureInfo都没有关系。能够仅指定一个忽略分隔符的指定格式似乎有些奇怪。

BigOldSofty answered 2019-11-16T00:05:34Z
-2 votes

试试:

在Web配置文件中配置

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

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

引用网址:[http://support.microsoft.com/kb/306162/]

RINESH answered 2019-11-16T00:06:19Z
-3 votes

将DateTimePicker Format属性设置为custom,将CustomFormat属性设置为M/dd/yyyy

Sandeep Ravi answered 2019-11-16T00:06:43Z
translate from https://stackoverflow.com:/questions/1368636/why-cant-datetime-parseexact-parse-9-1-2009-using-m-d-yyyy