Javascript setDate()将错误的日期设置为31号?
这很奇怪,我不知道我做错了什么。我有一个获取日期的函数(即此格式:Javascript setDate()将错误的日期设置为31号?,javascript,datetime,date,Javascript,Datetime,Date,这很奇怪,我不知道我做错了什么。我有一个获取日期的函数(即此格式: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(
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”
。我不确定该怎么办,也不确定问题出在哪里。您需要在设置日期之前设置月份(或者正如Marc B在评论中指出的,使用日期(yearval,monthval,dayval)
构造函数)
创建Date
对象时,默认为当前日期。在写这篇文章的时候是在六月,所以当你试着把这一天设为31天时,它就结束了
…由于闰年中的类似行为,您应该在设置月份或日期之前设置年份
(你在6月而不是7月开发了这段代码,这是一件好事——这个bug可能在9月之前都没有被发现,可能是你的用户发现了它,而不是你。:-为什么你要在一天的位置上加1(位置1)?我想这是你的问题
d.setDate(dspl[1] + 1);
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;
}
功能检查日期(输入){
var年、月、日、d、dt;
var dspl=input.split(“/”);
如果(dspl.length!=3)
返回NaN;
年份=parseInt(dspl[2],10);
月=parseInt(dspl[0],10)-1;
day=parseInt(dspl[1],10);
如果(年)| |月| |日){
返回NaN;
}
如果(年份<100){
年份+=2000年;
}
d=新日期(年、月、日);
var dt=jsToMsDate(d);
返回dt;
}
关于该更新的一些其他说明:
- 最好使用
解析来自最终用户的数字,并始终指定基数(十进制为10)。(不,parseInt
并不比parseInt
或一元Number
技巧慢。人们认为它慢,但是。)+
- 不需要在只有两个数字的年份上加上2000年的字符串。但是如果你愿意,你可以。注意,我削弱了验证,允许2001年为一位数,300年为三位数。因此,如果你需要那么强大,你需要重新调整
- 无需再次将日期实例馈送到
中new date()
函数检查日期(){
//订单错误-将于2016年5月1日返回
var start=新日期();
开始。设置日期(31);
开始。设定月(4);
起始年(2016年);
警报(启动)
//订单正确-将于2016年5月31日返回
var end=新日期();
年底(2016年);
完二〇〇四年一月(四);
截止日期(31);
警报(完)
}
您是否检查了最后的新日期(d)
对您的jsToMsDate()
函数所做的操作?可能是JS工作正常,但是你的jsToMs函数被破坏了。我已经尝试过了,仍然显示第1个而不是第31个。对不起,我已经编辑了我的代码<代码>d.setDate(dspl[1]+1)代码>是我在周围经历的事情,以查看我是否做错了什么。编辑了我的代码。另一个选项是执行d=newdate(yearval,monthval,dayval)
而不是单独执行.set…()
调用。“一个电话就可以解决这些包装问题”。@Saxman:@T.J.Crowder的答案比我的好得多——你应该接受这个答案。