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

时间:2011-06-24 17:23:05

标签: 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;
}

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

4 个答案:

答案 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。)
  • 无需使用字符串来添加2000年,只需要两位数即可。但如果你愿意,你可以。注意我在那里削弱了验证,允许(例如)2001年的一位数年份和(比如说)300 AD的三位数年份。因此,如果你需要它那么强大,你需要重新调整它。
  • 无需再次将日期实例提交到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)

右层次结构设置为年份,然后是月份,最后添加日期。 这将返回您添加的确切日期。

&#13;
&#13;
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;
&#13;
&#13;

这是设定日期的权利。