61

我有一个看起来像这样的字符串:“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)。但我不断收到可怕的“字符串未被识别为有效的日期时间”异常。

谢谢

一点跟进。以下是 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 不适用……出乎意料?

4

7 回答 7

97

我怀疑问题出在格式字符串中的斜杠与数据中的斜杠之间。这是格式字符串中对文化敏感的日期分隔符,最后一个参数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"));
于 2009-09-02T16:14:31.173 回答
3

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

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

如果您当前的文化不是“en-US”,这将解释为什么它对我有效,但对您无效,并且当您明确指定文化为“en-US”时有效。

于 2009-09-02T16:20:14.657 回答
2

尝试

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))
于 2009-09-02T16:15:33.340 回答
0

尝试这个

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

再见。

于 2009-09-02T16:17:16.363 回答
-1

我在XP上试过,如果PC设置为国际时间yyyy-Md,它就不起作用。在该行上放置一个断点并在处理之前将日期字符串更改为使用“-”代替“/”,您会发现它有效。您是否拥有 CultureInfo 没有任何区别。能够指定一个 expercted 格式只是让分隔符被忽略似乎很奇怪。

于 2010-07-14T23:55:39.487 回答
-4

尝试 :

在 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/

于 2015-03-04T09:09:15.463 回答
-4

将 DateTimePicker 的 Format 属性设置为 custom 并将CustomFormatprperty 设置为M/dd/yyyy.

于 2012-07-24T20:48:19.427 回答