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

.net, cultureinfo, datetime, parsing

Solution

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

Problem

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?

Original source