Why can't DateTime.ParseExact() parse “9/1/2009” using “M/d/yyyy”

人走茶凉 提交于 2019-11-26 04:25:57

问题


I have a string that looks like this: \"9/1/2009\". I want to convert it to a DateTime object (using C#).

This works:

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

But I don\'t understand why this doesn\'t work:

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

There\'s no word in the date (like \"September\"), and I know the specific format, so I\'d rather use ParseExact (and I don\'t see why CultureInfo would be needed). But I keep getting the dreaded \"String was not recognized as a valid DateTime\" exception.

Thanks

A little follow up. Here are 3 approaches that work:

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\"));

And here are 3 that don\'t work:

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);

So, Parse() works with \"en-US\", but not ParseExact... Unexpected?


回答1:


I suspect the problem is the slashes in the format string versus the ones in the data. That's a culture-sensitive date separator character in the format string, and the final argument being null means "use the current culture". If you either escape the slashes ("M'/'d'/'yyyy") or you specify CultureInfo.InvariantCulture, it will be okay.

If anyone's interested in reproducing this:

// 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"));



回答2:


I bet your machine's culture is not "en-US". From the documentation:

If provider is a null reference (Nothing in Visual Basic), the current culture is used.

If your current culture is not "en-US", this would explain why it works for me but doesn't work for you and works when you explicitly specify the culture to be "en-US".




回答3:


Try

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



回答4:


try this

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

Bye.




回答5:


I tried it on XP and it doesn't work if the PC is set to International time yyyy-M-d. Place a breakpoint on the line and before it is processed change the date string to use '-' in place of the '/' and you'll find it works. It makes no difference whether you have the CultureInfo or not. Seems strange to be able specify an expercted format only to have the separator ignored.




回答6:


Try :

Configure in web config file

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

eg: DateTime dt = DateTime.ParseExact("08/21/2013", "MM/dd/yyyy", null);

ref url : http://support.microsoft.com/kb/306162/




回答7:


Set DateTimePicker's Format property to custom and CustomFormat prperty to M/dd/yyyy.



来源:https://stackoverflow.com/questions/1368636/why-cant-datetime-parseexact-parse-9-1-2009-using-m-d-yyyy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!