这很奇怪,我不知道自己做错了什么。我有一个获取日期的函数(即,以这种格式: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"
。我不知道该怎么办,也不确定问题可能在哪里。
JavaScript的Date
对象允许您给出无效的月份和日期组合;它们会自动为您更正这些错误(例如,如果您将一个月的日期设置为31,而该月是6月,则会自动将其设置为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
或一元+
技巧慢。人们认为它是,但事实并非如此。) - 不需要用绳子把2000年加在只有两位数的年份上。但如果你愿意,你可以。注意,我削弱了那里的验证,2001年允许一位数的年份,公元300年允许三位数的年份。所以,如果你需要它那么强大,你需要重新调整
- 无需再次将日期实例馈送到
new Date()
中
您需要在设置日期之前设置月份(或者正如Marc B在评论中指出的那样,使用Date(yearval, monthval, dayval)
构造函数)。
创建Date
对象时,它默认为当前日期。写这篇文章的时候是六月,所以当你试图把这一天定为31日时,它就结束了。
由于闰年有类似的行为,你应该在设定月份或日期之前设定年份。
(你在6月而不是7月开发了这段代码,这是一项很好的工作——这个错误可能一直潜伏到9月才被发现,而且可能是你的用户而不是你发现了它。:-)
右侧层次结构设置为年,然后是月,最后添加日。这将返回您添加的确切日期
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)
}
<input type="button" value="Test" onclick="checkDate()" />
这是确定日期的正确继承权。
为什么要在当日仓位(仓位1)上加1?我认为这是你的问题。
d.setDate(dspl[1] + 1);