这很奇怪我不知道我做错了什么。我有一个函数来获取日期(即以这种格式:06/24/2011
),这是函数:
function checkDate(input){
var d = new Date();
var dspl = input.split("/");
if(dspl.length != 3)
return NaN;
d.setDate(dspl[1]);
d.setMonth(Number(dspl[0])-1);
if(dspl[2].length == 2)
d.setYear("20"+(dspl[2]+""));
else if(dspl[2].length == 4)
d.setYear(dspl[2]);
else
return NaN;
var dt = jsToMsDate(new Date(d));
return dt;
}
如果我输入该月的任何日期,它会正确解析日期,但如果我输入31日,即"01/31/2011"
,那么它将变为"01/01/2011"
。我不知道该怎么办,也不确定问题可能在哪里。
答案 0 :(得分:9)
JavaScript的Date
个对象允许您提供数月和日的无效组合;它们会自动为您校正(例如,如果您将月份的日期设置为月份为6月的31日,则会自动将其设置为7月1日)。这意味着如果您单独设置字段,则可能会遇到自动纠正妨碍您的方式。
在你的情况下,如果你要设置所有这三个字段,最好使用Date
构造函数的形式来接受它们作为参数:
var dt = new Date(year, month, day);
(如果你想要小时,分钟,秒和毫秒,你也可以将它们作为参数添加。)
所以看看你的代码,一个袖手旁观的更新:
function checkDate(input){
var year, month, day, d, dt;
var dspl = input.split("/");
if(dspl.length != 3)
return NaN;
year = parseInt(dspl[2], 10);
month = parseInt(dspl[0], 10) - 1;
day = parseInt(dspl[1], 10);
if (isNaN(year) || isNaN(month) || isNaN(day)) {
return NaN;
}
if (year < 100) {
year += 2000;
}
d = new Date(year, month, day);
var dt = jsToMsDate(d);
return dt;
}
有关该更新的其他一些说明:
parseInt
来解析最终用户的数字,并始终指定基数(十进制为10)。 (不,parseInt
并不比Number
或一元+
技巧慢。人们认为它是,但是it isn't。) new Date()
。答案 1 :(得分:7)
您需要在设置日期之前设置月份(或者在Marc B的评论中指出,使用Date(yearval, monthval, dayval)
构造函数)。
创建Date
对象时,默认为当前日期。在写这篇文章的时候是6月份,所以当你试图将这一天设置为31时,它就会结束。
...由于闰年的行为相似,你应该在设定月份或日期前设定年份。
(你在6月而不是7月开发这个代码是一个很好的工作 - 这个漏洞会在9月之前潜伏未被发现,并且可能是你的用户发现它而不是你。: - )
答案 2 :(得分:0)
为什么要在当天添加1个位置(位置1)?我认为这是你的问题。
d.setDate(dspl[1] + 1);
答案 3 :(得分:0)
右层次结构设置为年份,然后是月份,最后添加日期。 这将返回您添加的确切日期。
function checkDate() {
//Wrong order- will return 1 May 2016
var start = new Date();
start.setDate(31);
start.setMonth(4);
start.setFullYear(2016);
alert(start)
//Right order - will return 31 May 2016
var end = new Date();
end.setFullYear(2016);
end.setMonth(4);
end.setDate(31);
alert(end)
}
&#13;
<input type="button" value="Test" onclick="checkDate()" />
&#13;
这是设定日期的权利。