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

Syn*_*ror 8 javascript jquery html5

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

<input type='date' id='endDate'>
Run Code Online (Sandbox Code Playgroud)
$("#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);
}
Run Code Online (Sandbox Code Playgroud)

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

指定值"2017-02-29"不符合所需格式"yyyy-MM-dd".

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

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

gur*_*372 10

指定值"2017-02-29"不符合所需格式"yyyy-MM-dd".

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

只有闰年才有2月29日.

试试吧2016-02-29.

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

无需添加一堆if语句,您可以使用此答案

function leapYear(year)
{
  return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
Run Code Online (Sandbox Code Playgroud)

为了回答你的问题,如果你明确地设置日期像"2017-02-29"那么它将抛出一个错误.

只需在日期对象本身中进行更改,然后将该日期对象应用于输入

  $("#endDate").val( endDate.toJSON().slice(0,10) );
Run Code Online (Sandbox Code Playgroud)

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

编辑(根据TJ的评论)

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


T.J*_*der 7

这里真正的问题是你已经使用了getMonth不加1 的值.值从getMonth0(1月)开始,但yyyy-MM-dd格式中的月份值以1开头.

所以:

var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2);
// Note -------------^------------------^^^^^
Run Code Online (Sandbox Code Playgroud)

这就是你结束了一个无效的字符串,2017-02-29尽管已经使用的Date对象,这的确会确保它仅向您提供有效的日期.该Date对象包含日期为3月 29日,而不是2月29日.

然而:

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

您的代码不会这样做.它增加了一年零一个月,而不仅仅是一年:

endDate.setMonth(endDate.getMonth() + 1);       // <== Changing month
endDate.setFullYear(endDate.getFullYear() + 1);
Run Code Online (Sandbox Code Playgroud)

如果您只想添加一年,请删除这两行中的第一行.结合在一起,对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);
});
Run Code Online (Sandbox Code Playgroud)