简体   繁体   English

如何在C#中验证日期格式

[英]How to validate date format in C#

I want to check if a given string is a valid .net date format. 我想检查给定的字符串是否为有效的.net日期格式。

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. 对于有效的日期格式,它还返回false。

dateFormat = ,, => returns false =>Passed dateFormat = ,, =>返回false =>通过
dateFormat = someinvalidformat => returns false =>Passed dateFormat = someinvalidformat =>返回false =>通过
dateFormat = MM/dd/yyyy => returns false => Not Passed dateFormat = MM/dd/yyyy =>返回false =>未通过

So MM/dd/yyyy is valid dateformat. 因此MM/dd/yyyy是有效的dateformat。 But method returns false. 但是方法返回false。

Is there a better way to check if given date format is valid .Net date format? 有没有更好的方法来检查给定的日期格式是否为有效的.Net日期格式?

Update 1 更新1
I understand why method fails for MM/dd/yyyy or for other valid date formats. 我了解为什么方法对于MM/dd/yyyy或其他有效日期格式失败。 I am not asking why it fails. 我不是问为什么失败了。 MM/dd/yyyy is just common valid date time format i am using here for example. MM/dd/yyyy只是我在这里使用的常见有效日期时间格式。
I am looking for a way to check if the given date format is valid .Net date format. 我正在寻找一种检查给定日期格式是否为有效的.Net日期格式的方法。 So it could be any .Net date format. 因此它可以是任何.Net日期格式。

Since the format returned by DateTime.ToString does not match your format (it includes the time part), ParseExact fails. 由于DateTime.ToString返回的格式与您的格式不匹配(包括时间部分),因此ParseExact失败。

Validate the format by using public string ToString(string format, System.IFormatProvider provider) instead 通过使用public string ToString(string format, System.IFormatProvider provider)来验证格式

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. 请注意,日期/时间格式似乎无效,实际上可能是有效的,因为某些非格式字符只是按原样输出。 Eg 例如

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

results in "abc27e6A.D." 结果为"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

why not TryParse() or exact version? 为什么不使用TryParse()或确切版本? https://docs.microsoft.com/es-es/dotnet/api/system.datetime.tryparse?view=netframework-4.8 https://docs.microsoft.com/es-es/dotnet/api/system.datetime.tryparse?view=netframework-4.8

returns true if system can parse. 如果系统可以解析,则返回true。

It does "the same" your method does. 它与您的方法“相同”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM