【问题标题】:How to validate DateTime format?如何验证日期时间格式?
【发布时间】:2012-07-27 21:45:14
【问题描述】:

我想让用户输入 DateTime 格式,但我需要验证它以检查它是否可以接受。用户可以输入“yyyy-MM-dd”,这很好,但他们也可以输入“MM/yyyyMM/ddd”或任何其他组合。有没有办法验证这一点?

【问题讨论】:

    标签: c# validation datetime


    【解决方案1】:

    你在寻找这样的东西吗?

    DateTime expectedDate;
    if (!DateTime.TryParse("07/27/2012", out expectedDate))
    {
        Console.Write("Luke I am not your datetime.... NOOO!!!!!!!!!!!!!!");
    }
    

    如果您的用户知道所需的确切格式...

    string[] formats = { "MM/dd/yyyy", "M/d/yyyy", "M/dd/yyyy", "MM/d/yyyy" };
    DateTime expectedDate;
    if (!DateTime.TryParseExact("07/27/2012", formats, new CultureInfo("en-US"), 
                                DateTimeStyles.None, out expectedDate))
    {
        Console.Write("Thank you Mario, but the DateTime is in another format.");
    }
    

    【讨论】:

    • 这只验证特定的日期时间。用户实际上是在输入“格式”本身。
    • 您对我来说不是很清楚...您希望用户以任何格式输入日期,并且您希望它验证猜测正确的格式?你确定你的格式不会在歧义中发生冲突吗?向用户建议格式不是更好吗?
    • -1 这不是 Mindquake 所要求的。他们想要验证格式字符串,而不是日期字符串。
    • +1 用于书呆子控制台写入,因为这是我一直在寻找的答案。
    • 只是一个小提示:在匈牙利,人们使用“合并”的欧洲和美国格式:dd/MM/yyyy。因此“18/02/2020”在那里完全有效。
    【解决方案2】:

    我不知道有什么方法可以实际验证他们输入的格式,因为有时您想故意包含可以转换为任何内容的字符。您可能会考虑的一件事是允许用户通过显示他们输入的格式转换为的预览来进行自我验证。

    【讨论】:

    • +1 这是最佳答案 (IMO)。由于有效格式字符串的定义非常松散,因此与用户确认是最好的解决方案。
    • 您无需验证即可显示预览,因为如果您要执行DateTime.Now.ToString("This is made up and won't work"); 之类的操作,预览将显示T1i30 i30 14a4e up an4 will noP work。你可以包裹在一个try/catch 块中来处理任何非常奇怪的事情。
    【解决方案3】:

    我假设您想知道指定的格式字符串是否有效...

    为此,您可以往返:

    private bool IsValidDateFormat(string dateFormat)
    {
        try
        {
            String dts=DateTime.Now.ToString(dateFormat, CultureInfo.InvariantCulture);
            DateTime.ParseExact(dts, dateFormat, CultureInfo.InvariantCulture);
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    

    【讨论】:

      【解决方案4】:

      除非我记错了,否则唯一无效的 DateTime 格式字符串是一个字符长。您可以假设任何 2 个或更多字符的 DateTime 格式字符串都是有效的。

      DateTime.ParseExact("qq", "qq", null) == DateTime.Today
      DateTime.ParseExact("myy", "501", null) == "05/01/2001"
      

      Standard (1 character)
      Custom (>1 character)

      供参考,允许使用单个字符串作为格式:

      d,D,f,F,g,G,m,M,o,O,r,R,s,T,u,U,y,Y
      

      任何其他字符,例如q,本身都是无效的。所有其他字符串都将成功解析为格式化字符串。

      【讨论】:

      • 您还可以在% 前加上前缀,使单字符串也有效。 DateTime.Now.ToString("%x") == "x".
      • @MarkusJarderot:的确,我试图关注“无效的日期时间格式”由于其灵活性而非常罕见的事实。事实上,存在任何无效格式的唯一原因是您无法将y 指定为h 并得到奇怪的结果。
      【解决方案5】:

      您不会谈论您的验证策略。无论如何,您应该使用涉及正则表达式的东西,而不是应用允许的模式。这将有助于反对形式有效性..那么您必须注意实际内容并确保根据月、日和年的值是正确的。

      无论如何,有几个人建议使用 DateTime.TryParse() 方法让基板照顾你。但是无论如何您都必须指定格式!所以没有魔法!否则你会陷入歧义

      【讨论】:

        【解决方案6】:

        这对我有用-

        try
        {
          String formattedDate = DateTime.Now.ToString(dateFormat);
          DateTime.Parse(formattedDate);
          return true;
        }
        catch (Exception)
        {
          return false;
        }
        

        【讨论】:

          【解决方案7】:
          static private bool IsValidDateFormat(string dateFormat)
          {
            try
            {
              DateTime pastDate = DateTime.Now.Date.Subtract(new TimeSpan(10, 0, 0, 0, 0));
              string pastDateString = pastDate.ToString(dateFormat, CultureInfo.InvariantCulture);
              DateTime parsedDate = DateTime.ParseExact(pastDateString, dateFormat, CultureInfo.InvariantCulture);
              if (parsedDate.Date.CompareTo(pastDate.Date) ==0)
              {
                return true;
              }
              return false;
            }
            catch
            {
              return false;
            }
          }
          

          我确实使用此代码 - 它是对 shapiro yaacov 发布的修改。 它看起来像“DateTime.ParseExact”在使用无效的日期格式字符串时不会引发异常 - 它只是返回“DateTime.Now”。 我的方法是将过去的日期转换为字符串,然后检查 ParseExact() 是否返回该日期

          【讨论】:

            【解决方案8】:

            ZipXap 的答案接受任何不引发异常的格式,但像“aaaa”这样的格式将通过该验证并在午夜给出当前日期(“26-Apr-22 00:00:00”在写作时这个)。

            更好的方法是使用DateTimeStyles.NoCurrentDateDefault 选项并将结果与​​default 进行比较:

            using System.Globalization;
            
            var format = "aaaaa";
            try {
                var dt = DateTime.ParseExact(
                    DateTime.Now.ToString(format, CultureInfo.InvariantCulture),
                    format,
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.NoCurrentDateDefault);
                return dt != default;
            } catch {
                return false;
            }
            /*
            "aaaaa" -> false
            "h" -> false
            "hh" -> true
            "fff" -> true
            "gg" -> false
            "yyyy gg" -> true
            "'timezone: 'K" -> false
            "zzz" -> false
            */
            

            【讨论】:

              【解决方案9】:

              我的解决方案是将输入字段标记为只读,并允许用户仅通过jqueryui datepicker 更改值。

              它很直观。您可以指定您的首选格式,并且只需要验证这一种格式。

              否则你可能会遇到麻烦。你打算如何处理美国的“02/03/2020”,你将其解释为 2 月 3 日,但对于南美,它绝对是 三月二日。全球还有很多其他的日期格式。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-01-17
                • 1970-01-01
                • 2021-05-29
                • 2016-05-11
                • 2017-04-04
                • 2014-10-23
                • 2015-07-22
                相关资源
                最近更新 更多