我有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 语句更快?
答案 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);
});