Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DateTime.TryParse all possible type of dates

Tags:

c#

datetime

I want to check if a date has a correct format. There is many possibilities of correct dates like:

  • 02.08.2010
  • 2.8.2010
  • 02.8.2010 02.08
  • 02.August
  • ...

I can test each on with code like this:

if (DateTime.TryParse(DateTime.ParseExact(date, "dd.M.", 
                              new CultureInfo("sl-SI")).ToString(), out dt))

But then I can have 40 if statements. Is it possible to check all dates with one if statement or one loop?

Update:

Based on the answers so far, I am testing this code, but I have one more problem. What if I have just 9.2 not 9.2.2010 then this code will not work:

CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();

if (DateTime.TryParseExact(date, fmts, ci, DateTimeStyles.AssumeLocal, out dt))
{
    DateTime = Convert.ToDateTime(date);
    Check = true;
}

Must I manually add this times or what can I do?

like image 699
senzacionale Avatar asked Feb 24 '10 13:02

senzacionale


People also ask

What does DateTime TryParse do?

TryParse(String, DateTime)Converts the specified string representation of a date and time to its DateTime equivalent and returns a value that indicates whether the conversion succeeded.

What is DateTime TryParse C#?

The DateTime TryParse method converts the string representation of a date and time to a DateTime object and returns true if the conversion was successful and false if otherwise.

What is the use of TryParse in C#?

TryParse(String, Int32) Converts the string representation of a number to its 32-bit signed integer equivalent. A return value indicates whether the conversion succeeded.


2 Answers

You can use something like the following, but be aware that more than one format might be able to parse the same date. For example 10/11/12 can be parsed as yy/MM/dd or MM/dd/yy, which are both valid US date formats. MM/dd/yy is more common, so it appears first in the list and is the one returned by the code below (if you use it with a US culture instead of the culture in the example).

string testValue = "10.11.12";

DateTime result;
CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
Console.WriteLine(String.Join("\r\n", fmts));
if (DateTime.TryParseExact(testValue, fmts, ci,
   DateTimeStyles.AssumeLocal, out result))
{
   Console.WriteLine(result.ToLongDateString());
}
like image 128
BlueMonkMN Avatar answered Nov 07 '22 09:11

BlueMonkMN


Yes ParseExact can take a list of formats to check against.

var formats = new[] { "M.d.yyyy", "dd.MM.yyyy" };
var dateValue = DateTime.ParseExact(
    dateString, formats, new CultureInfo("sl-SI"), DateTimeStyles.None);
like image 45
Darin Dimitrov Avatar answered Nov 07 '22 07:11

Darin Dimitrov