设置输入类型日期错误的值

时间:2016-02-16 10:00:42

标签: javascript jquery html5

我有2个字段的输入和输出日期。在某些情况下,我将endDate设置为比开始日期提前1年。

<input type='date' id='endDate'>
$("#startDate").change(function(){
    var endDate = new Date($("#startDate").val());
    endDate.setMonth(endDate.getMonth() + 1);
    endDate.setFullYear(endDate.getFullYear() + 1);
    var myDay = ("0" + endDate.getDate()).slice(-2);
    var myMonth = ("0" + endDate.getMonth()).slice(-2);
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay);
}

将开始日期设置为2-29-2016时的问题 我收到以下错误:

  

指定值“2017-02-29”不符合要求   格式,“yyyy-MM-dd”。

我希望Date()函数能够处理它。显然,他们没有。这是一个错误吗?

他们的反应是否比添加一堆 if 语句更快?

2 个答案:

答案 0 :(得分:10)

  

指定值“2017-02-29”不符合要求   格式,“yyyy-MM-dd”。

2017-02-29不是有效日期。明年(2017年)的29th feb是不可能的。

只有闰年才有2月29日。

请尝试2016-02-29

  

他们的反应是否比添加一堆if语句更快?

无需添加if语句,您可以使用此answer

function leapYear(year)
{
  return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

为了回答你的问题,如果你明确地设置日期,如“2017-02-29”那么它将引发错误。

只需在日期对象本身进行更改,然后通过

将该日期对象应用于输入
  $("#endDate").val( endDate.toJSON().slice(0,10) );

现在它应该照顾到下个月。

编辑(根据TJ的评论)

闰年每年都会被4整除,除了可被100整除(不是闰年)的闰年,除了可被400整除的闰年(闰年)。

答案 1 :(得分:7)

这里真正的问题是你使用getMonth的值而不添加1。 getMonth的值从0(1月)开始,但yyyy-MM-dd格式的月份值以1开头。

所以:

var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2);
// Note -------------^------------------^^^^^

尽管使用了2017-02-29对象,但你最终得到了一个无效的字符串Date,这确实会确保它只给你有效的日期。 Date对象包含日期 3月 29日,而不是2月29日。

然而:

  

在某些情况下,我将endDate设置为比开始日期提前1年。

您的代码不会这样做。它增加了一年和一个月,而不只是一年:

endDate.setMonth(endDate.getMonth() + 1);       // <== Changing month
endDate.setFullYear(endDate.getFullYear() + 1);

如果您只想添加一年,请删除这两行中的第一行。结合使用getMonth形成字符串的方式,可以在日期中可靠地添加一年(可能会有月翻转)。

所以:

$("#startDate").change(function(){
    var endDate = new Date($("#startDate").val());
    endDate.setFullYear(endDate.getFullYear() + 1);
    var myDay = ("0" + endDate.getDate()).slice(-2);
    var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2);
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay);
});