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整除的闰年(闰年).
这里真正的问题是你已经使用了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)