LP13
LP13

Reputation: 34179

How to validate date format in C#

I want to check if a given string is a valid .net date format.

so i have the following function that checks if the date format is correct

    public void IsValidDateFormat(string dateFormat)
    {
        var flag = true;
        try
        {
            DateTime.ParseExact(DateTime.Now.ToString(),
                dateFormat,
                System.Globalization.CultureInfo.InvariantCulture);
        }
        catch (Exception ex)
        {
            flag = false;
        }

       return flag;
    }

However, The method is not working as expected. For a valid date format also it returns false.

dateFormat = ,, => returns false =>Passed
dateFormat = someinvalidformat => returns false =>Passed
dateFormat = MM/dd/yyyy => returns false => Not Passed

So MM/dd/yyyy is valid dateformat. But method returns false.

Is there a better way to check if given date format is valid .Net date format?

Update 1
I understand why method fails for MM/dd/yyyy or for other valid date formats. I am not asking why it fails. MM/dd/yyyy is just common valid date time format i am using here for example.
I am looking for a way to check if the given date format is valid .Net date format. So it could be any .Net date format.

Upvotes: 2

Views: 5789

Answers (2)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112762

Since the format returned by DateTime.ToString does not match your format (it includes the time part), ParseExact fails.

Validate the format by using public string ToString(string format, System.IFormatProvider provider) instead

public bool IsValidDateFormat(string dateFormat)
{
    try {
        string s = DateTime.Now.ToString(dateFormat, CultureInfo.InvariantCulture);
        DateTime.Parse(s, CultureInfo.InvariantCulture);
        return true;
    } catch {
        return false;
    }
}

Note that date/time formats that may seem not to be valid, can in fact be valid, as some non-format characters are just outputted as is. E.g.

DateTime.Now.ToString("abcdefg", CultureInfo.InvariantCulture)

results in "abc27e6A.D.". So it is in fact a valid date/time format, even if it does not make a lot of sense. You can enhance the quality of the test by trying to parse the resulting date string. This will eliminate a lot of nonsensical formats.

This test ...

Console.WriteLine(IsValidDateFormat(",,"));
Console.WriteLine(IsValidDateFormat("a"));
Console.WriteLine(IsValidDateFormat("MM/dd/yyyy hh:mm:ss"));
Console.WriteLine(IsValidDateFormat("MM/dd/yyyy"));
Console.WriteLine(IsValidDateFormat("abcdefg"));
Console.ReadKey();

... prints

False
False
True
True
False

Upvotes: 4

DrkDeveloper
DrkDeveloper

Reputation: 949

why not TryParse() or exact version? https://learn.microsoft.com/es-es/dotnet/api/system.datetime.tryparse?view=netframework-4.8

returns true if system can parse.

It does "the same" your method does.

Upvotes: -1

Related Questions