日期的javascript验证需要字符串进行比较

时间:2011-10-04 08:21:04

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

有些时候我曾在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日(2011年10月4日),结束日期是2011年12月2日(2011年12月2日)。在这种情况下,警报不应该被触发但它仍然会被激活(因为04> 02)。

我在这里犯了什么错误?

3 个答案:

答案 0 :(得分:0)

<script type="text/javascript">
var d = Date.parse("Jul 8, 2005");
document.write(d);
</script>

上述代码的输出将为:1120773600000

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

答案 1 :(得分:0)

您所犯的错误是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日对应的日期对象。

答案 2 :(得分:0)

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

我遇到过这种类型的问题B4。如果您网站的客户都要以“dd / mm / yyyy”格式输入日期时间,那么您需要一个“correctDate()”函数来将日期部分替换为input-date-string中的month部分。

该功能可能如下所示:

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){
....