2016-09-08 4 views
0
  1. 私は期間を受け入れているフォームを持っています。これは1ヶ月、1年、2ヶ月、20日などとなります。動的な日付の違いを扱う

  2. この期間に基づいて、この期間のx日前の誕生日を持つすべての子供にメールが送信されます。

  3. 人は28,29,30、または31日のいずれかの月に生まれる可能性があるので、これにより日付差を痛感することができます。

  4. 私がこれまで行ってきたことは、月から30日、年から365日に変換され、これに基づいて私の計算が行われました。

さまざまな月や閏年を考慮して、このような動的な日付の違いを処理する、より洗練された方法はありますか?

+0

この目的のために* set *メソッドとget *メソッドがあります。 – RobG

答えて

1

日の追加、月と年はかなりですまっすぐ進む。月を追加するときは、新しい月の日付が最初の月と同じであることをチェックし、そうでない場合は、日付を0に設定します(つまり、余分な月をロールオーバーしたため、前の月)。年を追加する場合と同じですが、2月にのみ発生します。例えば。

function addMonths(date, months) { 
 
    var d = new Date(+date); 
 
    var startDate = d.getDate(); 
 
    d.setMonth(d.getMonth() + months); 
 
    if (d.getDate() != startDate) d.setDate(0); 
 
    return d; 
 
} 
 

 
function addYears(date, years) { 
 
    return addMonths(date, years * 12); 
 
} 
 

 
var d = new Date(2016,4,31); 
 
console.log(d.toLocaleString() + ' plus one month is \n' + 
 
      addMonths(d,1).toLocaleString()); 
 

 
d = new Date(2016,1,29); 
 
console.log(d.toLocaleString() + ' plus one year is \n' + 
 
      addYears(d, 1).toLocaleString());

あなたも、便宜上Date.prototypeの方法として、これらを追加することができます。

日付演算は必ずしも対称ではありません。

+0

うるう年の場合は扱いません。 2月29日から1年は2月29日ではありません。 –

+0

それは私が言及しただけの他のすべてのケースで完全に機能します。 –

+0

ありません。例を参照してください。もしあなたがうるう年の土地に2016年2月29日に何年も追加すれば、2月29日にもう一度訪れるでしょう。非閏年は2月28日に返されます。 – RobG

1

あなたはただそのためにバニラのJSを使用することができます -

ヶ月 -

var d = new Date(); 
d.setMonth(d.getMonth() - x); 

年のため -

var d = new Date(); 
d.setYear(d.getYear() - x); 

日間 -

var d = new Date(); 
d.setDate(d.getDate() - x); 
+0

ありがとう、答えを編集 - それは最初の場所でそれを作成するよりも、日付を操作することについてとにかくでした。 – naortor

+2

OPはこれらの方法を認識しています(私は思いますが)問題は、1月31日を1月に加算すると2月31日になり、2月または3月に調整されるということです(閏年かどうかによる)。これは、OPが対処しようとしている問題です。日、時間などはすべて同じ長さです(夏時間境界を超えて...を除く)。 – RobG

関連する問題