【问题标题】:javascript validation for dates takes string for comparison日期的 javascript 验证需要字符串进行比较
【发布时间】:2011-10-04 08:21:03
【问题描述】:

以前我曾在 SO 中向question 询问如何验证 startdate

我写的JS如下;

function DateValidation(startDate, endDate) {
                if (startDate != ' ' && endDate != ' ') 
                {
                    var stdate = Date.parse(startDate);
                    var enddate = Date.parse(endDate);
                    if (stdate > enddate) 
                    {
                        alert('Start date cannot be greater than end date!');
                        return false;
                    }
                    else 
                {
                    return true;
                }
               }
            }

该函数在单击提交按钮时被调用。它被注册为;

OnClientClick="javascript: return DateValidation(window.document.getElementById('txtStartDate').value,window.document.getElementById('txtEndDate').value);"

现在假设开始日期是 2011 年 10 月 4 日 (04/10/2011),结束日期是 2011 年 12 月 2 日 (02/12/2011)。在这种情况下,警报不应被触发,但仍会被触发(因为 04 > 02)。

我在这里犯了什么错误?

【问题讨论】:

    标签: javascript .net asp.net visual-studio


    【解决方案1】:

    您的 startDate 和 endDate 参数应采用 mm/dd/yyyy 格式。但是你以dd/mm/yyyy格式提供它们,所以发生了意想不到的事情。

    我遇到过这种问题 B4。如果您网站的客户都准备以“dd/mm/yyyy”格式输入日期时间,那么您需要一个“correctDate()”函数来将输入日期字符串中的日期部分替换为月份部分。

    函数可能如下所示:

    function correctDate(D){
           var D=D.split('/');
           return D[1]+'/'+D[0]+'/'+D[2]
    }
    //input :  2/10/2011 , output :  10/2/2011
    

    而在 DateValidation() 函数中,你可以这样使用它:

    ....
          var stdate = Date.parse( correctDate(startDate) );
          var enddate = Date.parse( correctDate(endDate) );
          if (stdate > enddate){
    ....
    

    【讨论】:

    • 但这会改变整个日期。在你的例如。 2/10 是 10 月 2 日,会变成 2 月 10 日??
    • 加上我的问题,我会在哪里调用correctDate函数?
    • 正如我在回答中所说,“如果您网站的客户都将输入格式为“dd/mm/yyyy”的日期时间,那么,您可以使用我的方法。您如何检查值:2/10/2011 如果您不知道用户的意思是“2”是“2nd”还是“Feb”?与“5/5/2011”相比,这个值是否有效???
    • 您可以在 DateValidation 函数中使用“correctDate”函数。正如我的回答:“...var stdate = Date.parse(correctDate(startDate));....”
    【解决方案2】:
    <script type="text/javascript">
    var d = Date.parse("Jul 8, 2005");
    document.write(d);
    </script>
    

    上面代码的输出将是:1120773600000

    所以你的推理不可能是正确的。解析后尝试提醒标准日期和结束日期。那里正在发生一些事情。

    【讨论】:

      【解决方案3】:

      您所犯的错误是 Date.parse 将 xx/xx/xxxx 格式的字符串解释为美国风格的日期,月份在前。 04/10/2011 被视为 4 月 10 日,而不是 10 月 4 日。

      这是一个成绩单:

      > var startDate = '04/10/2011';var stdate = Date.parse(startDate)
      > startDate
      04/10/2011
      > stdate
      1302418800000
      > var endDate = '02/12/2011';var enddate = Date.parse(endDate);
      > endDate
      02/12/2011
      > enddate
      1297497600000
      > stdate > enddate
      true
      

      恕我直言,您应该避免这样的模棱两可的日期格式。如果要使用日期字符串,强制用户输入 ISO8601 (yyyy/MM/dd) 格式的文本。

      ECMAScript 5 浏览器对 ISO8601 的支持不错。另请参阅 Date.js 库。或者this SO question for more info

      附录

      内置 Date.parse 函数是documented here。你可以看到它不支持 DD/MM/YYYY。虽然邪恶的程序员可以接受 DD/MM/YYYY 形式的字符串并使用 substringconcat(或正则表达式)以可接受的格式重写 Date.parse,但我假设您不是邪恶的程序员.

      正确的解决方案是使用接受格式字符串的日期解析器。对于 JavaScript,一个这样的库是 Date.js。它将允许您编写以下内容:

      Date.parseExact("20/04/2011", "dd/MM/yyyy");
      

      并获取对应于 2011 年 4 月 20 日的日期对象。

      【讨论】:

      • 你想做什么? “正确”是指您希望人们输入 DD/MM/YYYY?或者你能接受其他格式吗?我可以补充我的答案;告诉我你想走哪条路。
      • 我希望保持日期格式,因为它是 04/10 应该是 10 月 4 日而不是 4 月 10 日
      • Javascript 中没有 Date.parseExact 之类的东西
      • @Xorpower, Date.parseExact 来自答案中引用的 Date.js 库。如果您出于某种原因不想使用第三方库,您可以随意使用字符串并自己构建日期。正如我提到的,这对于正则表达式是可行的,但恕我直言,这是一个 hack。如果你正在做任何严肃的日期处理,你应该使用一个库,而 Date.js 是相当有名的。
      猜你喜欢
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多