javascript日期验证使用字符串进行比较

javascript validation for dates takes string for comparison

本文关键字:比较 字符串 日期 验证 javascript      更新时间:2023-09-26

有一段时间,我在SO中问过如何验证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日(2011年10日4日(,结束日期为2011年底12月2日(2011年底2日(。在这种情况下,警报不应该被触发,但它仍然会被触发(因为04>02(。

我在这里犯了什么错误?

您的开始日期&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){
....
<script type="text/javascript">
var d = Date.parse("Jul 8, 2005");
document.write(d);
</script>

上述代码的输出将是:11207736000

所以你的推理不可能是正确的。解析后,尝试提醒stdate和enddate。那里正在发生一些事情。

您所犯的错误是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

IMHO你应该避免像这样模棱两可的日期格式。如果要使用日期字符串,请强制用户输入ISO8601(yyyy/MM/dd(格式的文本。

ECMAScript 5浏览器对ISO8601提供了不错的支持。另请参阅Date.js库。或者这个SO问题,了解更多信息。

附录

内置的Date.parse函数在此处进行了说明。您可以看到它不支持DD/MM/YYYY。虽然一个邪恶的程序员可以接受DD/MM/YYYY形式的字符串,并使用substringconcat(或正则表达式(以Date.parse的可接受格式进行重写,但我认为你不是一个邪恶程序员。

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

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

并得到对应于2011年4月20日的日期对象。