Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/480.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setDate()将错误的日期设置为31号?_Javascript_Datetime_Date - Fatal编程技术网

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;
}
关于该更新的一些其他说明:

  • 最好使用
    parseInt
    解析来自最终用户的数字,并始终指定基数(十进制为10)。(不,
    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的答案比我的好得多——你应该接受这个答案。