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



这很奇怪,我不知道自己做错了什么。我有一个获取日期的函数(即,以这种格式: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);

相关内容

  • 没有找到相关文章

最新更新