【问题标题】:Verify a date in JavaScript在 JavaScript 中验证日期
【发布时间】:2009-01-19 09:08:00
【问题描述】:

我需要对日期字段进行用户验证,其格式应为 yyyyMMdd,并且不应该超过未来一年。我该怎么做呢?目前我只有一个粗略的正则表达式是不够的。

function VerifyDate(source, args)
{
    var regexp = /^([1-2]{1}[0-9]{1})\d{2}([0][1-9]|[1][0-2])([0][1-9]|[1-2][0-9]|[3][0-1])$/
    var result = args.Value.match(regexp);     
    if(result) {
        args.IsValid = true;
    } else {
        args.IsValid = false;
    }       
}

【问题讨论】:

    标签: asp.net javascript validation date


    【解决方案1】:

    仅使用正则表达式检查格式。你可以保持简单:

    ^(\d{4})(\d{2})(\d{2})$
    

    然后解析日期并检查范围:

    function VerifyDate(source, args)
    {
      args.IsValid = false;
      var regexp = /^(\d{4})(\d{2})(\d{2})$/;
      var daysInMonth = function (y, m) {return 32-new Date(y, m, 32).getDate(); };
    
      var ma = regexp.exec(args.Value);
      if (ma && ma.length == 4 && ma[2] < 12 && ma[3] <= daysInMonth(ma[1], ma[2]))
      {
        var diff = new Date(ma[1], ma[2], ma[3]) - new Date();
        args.IsValid = diff < 31536000000; // one year = 1000ms*60*60*24*365
      }
    }
    

    【讨论】:

    • 上面的代码接受 20019999,因为 new Date() 不会在 javascript 中抛出异常 if month>12 或 day > daysInMonth(month)。
    • 哦。我期待它。谢谢,我会考虑的。
    • 关闭但仍然不对...还有至少 2 个错误:其中之一是 12 月的所有日期都被视为无效。
    【解决方案2】:

    如果月份或日期超出范围,new Date() 不会抛出异常。它使用内部 MakeDay 来计算日期(参见ECMAScript Language Specification 第 15.9.3.1 和 15.9.1.13 节)。为确保日期在下面的函数中有效,将输入转换为整数,然后再将其转换为日期,然后将日期的部分与整数进行比较。

    由于日期使用 MakeDay,即使 now 是 leep 日,maxDate 的计算仍然有效(xxxx0229 将是 yyyy0301,其中 yyyy=xxxx+1)

    function verifyDate(args)
    {
        var result=false,
            match = args.Value.match(/^(\d{4})(\d{2})(\d{2})$/);
        if (match && match.length === 4)
        {
            var year = parseInt(match[1],10),
                month =parseInt(match[2],10) -1, // 0 = January
                day = parseInt(match[3],10),
                testDate= new Date(year,month,day),
                now = new Date(),
                maxDate = new Date(now.getFullYear() + 1, now.getMonth(), now. getDate()),
                minDate = new Date(1800,0,1),
                result = (
                     testDate.getFullYear() === year &&
                     testDate.getMonth() === month &&
                     testDate.getDate() === day &&
                     testDate >= minDate &&
                     testDate <= maxDate
                );
       }
       args.IsValue = result;
       return result;   
    }
    

    【讨论】:

      【解决方案3】:

      我最终采用的解决方案是结合了您的答案,我使用了 datejs,这看起来很不错。这是我的最终验证功能。由于某种原因,月份似乎使用了基于 0 的索引,所以这就是它在 .set() 中显示 -1 的原因。

      function VerifyDate(source, args)
      {
          args.IsValid = false;
          var regexp = /^(\d{4})(\d{2})(\d{2})$/;
          var m = regexp.exec(args.Value);
          if (m && m.length == 4) {
              try {
                  var result = Date.today().set({ year: Number(m[1]), month: Number(m[2]-1), day: Number(m[3]) });
                  if (result < Date.today().add({ years: 1 })) {
                      args.IsValid = true;
                  }
              }
              catch (ex) {
              }
          }
      }
      

      【讨论】:

      • “月份由 0 到 11 范围内的整数标识,包括 0 到 11。”请参阅ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf中的第 15.9.1.4 节
      • 很好,今天之前我不知道,也没有看过 ECMA 规范。但是在某处不是有一些更容易理解的格式的 javascript 参考吗?像一个网络目录?挖掘 pdf 充其量是很麻烦的。
      • pdf 是权威的技术资源。更用户友好的资源是w3schools.com/jsref/default.asp
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多