Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DateTime.TryParseExact CultureInfo.InvariantCulture

Tags:

c#

c#-4.0

Can anyone see what I'm doing wrong, I'm trying to parse the date to ensure its a valid date, if so convert it to the format I require.

I have tried different ways of doing this, but all return 01/01/0001 00:00:00.

value of string parseArrivalDate = 02/02/2013

DateTime ukDateFormat;
string ukFormat = "0:ddd, MMM d, yyyy";    
DateTime.TryParseExact(parseArrivalDate, ukFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out ukDateFormat);    
DateTime test = ukDateFormat; 

-------------------------------------EDIT-------------------------------

OK sorry, I did not explain it very well. If I enter UK format say 27/02/2013, and when I had UK format as dd/MM/yyyy it worked ok, problem was when I was entering US or any other format, it was returning the incorrect date, so I was changing the format round thinking that was the problem.

It has now dawned on me after reading your comments, that I had the uk format correct 1st time, so my problem is, how can I change the code, so that any date format can be parsed correctly.

Hope that makes more sense Thanks

like image 887
CareerChange Avatar asked Mar 27 '13 12:03

CareerChange


2 Answers

Your string

"0:ddd, MMM d, yyyy"

has a number 0, a colon :, and a format corresponding to

"Wed, Mar 27, 2013"

for example, if the culture is "en-GB" ("English (United Kingdom)"). It probably comes from a String.Format, Console.WriteLine or similar method call, where it is put into braces {} to format a text, as in

Console.WriteLine("The date {0:ddd, MMM d, yyyy} was selected.", someDateTime);

It would work with code like:

string arrivalDateString = "Wed, Mar 27, 2013";

...

DateTime result;
string yourFormat = "ddd, MMM d, yyyy";    // no "0:" part
bool isOK = DateTime.TryParseExact(arrivalDateString, yourFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);    
if (isOK)
{
    // Worked! Answer is in 'result' variable
}
else
{
    // Didn't work! 'result' variable holds midnight 1 January 0001
}

The format that corresponds to "27/03/2013" is "dd/MM/yyyy" (or "d/M/yyyy"). The format that corresponds to "03/27/2013" is "MM/dd/yyyy" (or "M/d/yyyy").

It is not possible to have one method that handles both styles of dates, since a string like

"01/04/2013"   /* ambiguous */

could mean either

  • 1 April 2013
  • January 4, 2013

so it's ambiguous, and there's no way we can tell what date is meant. See also Wikipedia: Calendar date → Date format.

like image 137
Jeppe Stig Nielsen Avatar answered Sep 25 '22 15:09

Jeppe Stig Nielsen


your date string is: 02/02/2013 and the format you are using is "0:ddd, MMM d, yyyy" which is wrong, it should be MM/dd/yyyy if its month first.

DateTime ukDateFormat;
string ukFormat = "MM/dd/yyyy";    
DateTime.TryParseExact(parseArrivalDate, ukFormat,CultureInfo.InvariantCulture,DateTimeStyles.None, out ukDateFormat);    
 DateTime test = ukDateFormat; 

If the date you have specified contains day first then month, then use the format "dd/MM/yyyy", By the way you can using single d and M for both single digit and double digits day/month.

Currently you are getting the DateTime.MinValue, since parsing is failing because of the invalid format.

like image 31
Habib Avatar answered Sep 23 '22 15:09

Habib