Why can't DateTime.ParseExact() parse "9/1/2009" using "M/d/yyyy"
.NetDatetimeParsingCultureinfo.Net Problem Overview
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?
.Net Solutions
Solution 1 - .Net
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"));
Solution 2 - .Net
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".
Solution 3 - .Net
Try
Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))
Solution 4 - .Net
try this
provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);
Bye.
Solution 5 - .Net
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.
Solution 6 - .Net
Set DateTimePicker's Format property to custom and CustomFormat
prperty to M/dd/yyyy
.
Solution 7 - .Net
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/