有些时候我曾在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)。
我在这里犯了什么错误?
答案 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形式的字符串,并使用substring
和concat
(或正则表达式)以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){
....