2016-02-16 44 views
8

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); 
} 
私は、次のエラーを得た2016年2月29日 に開始日を設定し、問題

:私はそれの世話をする日付()関数を期待

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

。明らかに、彼らはしません。これはバグですか?

とにかくの束を追加するよりも速いですか文?

答えて

7

実際の問題は、getMonthという値を1つ追加せずに使用したことです。あなたが使用したにも関わらず、無効な文字列、2017-02-29、になってしまった方法です

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

:だから1

で始まるあなたのyyyy-MM-dd形式でgetMonth 0で始まる(1月)が、月の値から値Dateオブジェクトは、実際には有効な日付のみを提供します。 Dateオブジェクトには、2月29日ではなく、月3日29が含まれています。

しかし:

On certain conditions I set the endDate to be 1 year ahead of start date.

あなたのコードでは、それを行うことはありません。それは年と月だけでなく、年を追加します。

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

あなたが唯一の年間追加したい場合は、これらの2つのラインの最初のを削除します。これを組み合わせると、文字列を作成するときに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); 
}); 
10

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

2017-02-29は有効な日付ではありません。来年の29th feb(2017)はできません。

のみ29

の2月の月を持っている閏年ではなく2016-02-29を試してみてください。

Is their anyway faster than adding a bunch of if statements?

if文の束を追加する必要はありません、あなたが明示的に「2017年2月29日」のように日付を設定した場合、それは意志、あなたの質問に答えるために、このanswer

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

を使用することができますエラーを投げる。

ただ、今では来月にロールオーバーの世話をする必要がある日付オブジェクト自体に変更を加えると

$("#endDate").val(endDate.toJSON().slice(0,10)); 

によって入力にその日付オブジェクトを適用します。

(TJさんのコメントに基づいて)編集

閏年は400で割り切れるものを除いて、(閏年されていません)100で割り切れるものを除き、4で割り切れる毎年起こる(これうるう年です)。

+2

あなたは私の#RESPECTを得たが;)OPが100で割り切れる*ものを除い* – Rayon

+1

閏年は4で割り切れる毎年起こる。.. 'if'条件を必要とするかもしれませ(うるう年ではありません)、*除外する400を除いたもの(*はうるう年)です。 –

+1

はい、これはうるう年の問題です。しかし、私の質問は、Date()関数がそれを世話するべきではないということですか?それとも手動で行うべきですか? –

関連する問題