【问题标题】:YYYYMMDD Date Format regular Expression to validate a date in C# .netYYYYMMDD 日期格式正则表达式来验证 C# .net 中的日期
【发布时间】:2011-01-22 08:16:44
【问题描述】:

我需要在 C# 中使用正则表达式验证日期格式。

格式如下:"YYYYMMDD"

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    正则表达式不适合此任务。例如,很难编写一个匹配有效日期“20080229”但不匹配无效日期“20100229”的正则表达式。

    您应该将DateTime.TryParseExact 与格式字符串"yyyyMMdd" 一起使用。这是一个例子:

    string s = "20100229";
    DateTime result;
    if (!DateTime.TryParseExact(
         s,
         "yyyyMMdd",
         CultureInfo.InvariantCulture,
         DateTimeStyles.AssumeUniversal,
         out result))
    {
        Console.WriteLine("Invalid date entered.");
    };
    

    【讨论】:

      【解决方案2】:

      好的,这是我构建过的最漂亮的正则表达式。这占了自 1582 年引入闰年以来的所有闰年。它还每四世纪处理一次非飞跃。例如,1600 是闰,但 1700 不是,尽管它可以被四整除。我在 1582 到 9999 之间的所有日子里都对此进行了测试。

      var yyyymmdd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))$");
      

      另一个使用破折号的版本

      var yyyyDashMmDashDd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:[01][0-9]|2[0-8])))))$");
      

      我喜欢这几乎适用于所有语言,只要它们支持正则表达式。虽然可以说使用特定语言的日期解析器更明智,但我认为这显示了正则表达式的强大和优雅。

      如果你想看的话,这里有一个 image 的 Regexper 中带有斜线的模式。

      【讨论】:

        【解决方案3】:

        考虑使用DateTime.TryParseExact 来验证日期。 您可以使用该方法同时验证和读取 DateTime 值。

        例如:

        DateTime dateValue;
        if (DateTime.TryParseExact(dateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
        {
         //Parsed Successfully   
        }
        

        【讨论】:

          猜你喜欢
          • 2010-11-24
          • 2014-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多