setDate()在31日设置错误的日期?

Sax*_*man 2 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(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;
}
Run Code Online (Sandbox Code Playgroud)

如果我输入该月的任何日期,它将正确解析日期,但如果我输入31,即"01/31/2011",它将变为"01/01/2011".我不知道该怎么办,也不确定问题可能在哪里.

T.J*_*der 9

JavaScript的Date对象允许您提供无效的月和日组合; 它们会自动为您校正(例如,如果您将月份的日期设置为月份为6月的31日,则会自动将其设置为7月1日).这意味着如果您单独设置字段,您可以遇到自动纠正妨碍您的方式.

在您的情况下,如果您要设置所有这三个字段,最好使用Date接受它们作为参数的构造函数的形式:

var dt = new Date(year, month, day);
Run Code Online (Sandbox Code Playgroud)

(如果您需要小时,分钟,秒和毫秒,您也可以将它们添加为参数.)

所以看看你的代码,一个袖手旁观的更新:

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;
}
Run Code Online (Sandbox Code Playgroud)

关于该更新的一些其他说明:

  • 最好用于parseInt解析最终用户的数字,并始终指定基数(10为十进制).(不,parseInt不是慢于Number或者是一般的+技巧.人们认为它是,但事实并非如此.)
  • 没有必要用字符串来添加2000年只有两位数.但如果你愿意,你可以.注意我在那里削弱了验证,允许(例如)2001年的一位数年份和(比如说)300 AD的三位数年份.因此,如果你需要它那么强大,你需要重新调整它.
  • 无需new Date()再次提供日期实例.


Ric*_*dle 7

您需要设置日期之前设置月份(或者在Marc B的评论中指出,使用Date(yearval, monthval, dayval)构造函数).

创建Date对象时,默认为当前日期.在撰写六月的时候,所以当你试图将这一天设置为31时,它就会结束.

...由于闰年中的行为相似,您应该在设置月份或日期之前设置年份.

(你在6月而不是7月开发这个代码是一个很好的工作 - 这个bug会在9月之前潜伏未被发现,并且它可能是你的用户发现它而不是你.:-)

  • 另一个选择是执行`d = new Date(yearval,monthval,dayval)`而不是单独执行`.set ...()`调用.通过一次调用就可以解决这些包装问题. (2认同)