2011-06-15 4 views
14

私は2011年7月6日水曜日から隔週のスケジュールに基づいて次のリサイクルの日付を与える簡単なスクリプトを作成しようとしています。これまでのところ。シンプルなjavascriptの日付数...本当に

function getNextDate(startDate) { 
     if (today <= startDate) { 
      return startDate; 
     } 
     // calculate the day since the start date. 
     var totalDays = Math.ceil((today.getTime()-startDate.getTime())/(one_day)); 
     // check to see if this day falls on a recycle day 
     var bumpDays = totalDays%14; // mod 14 -- pickup up every 14 days... 
     // pickup is today 
     if (bumpDays == 0) { 
      return today; 
     } 
     // return the closest day which is in 14 days, less the # of days since the last 
     // pick up.. 
     var ms = today.getTime() + ((14- bumpDays) * one_day); 
     return new Date(ms); 
    } 

など、それを呼び出すことができます...

var today=new Date(); 
var one_day=1000*60*60*24; // one day in milliseconds 
var nextDate = getNextDate(new Date(2011,06,06)); 

とても良い...しかし、私は2011年10月27日に「今日」を投影したときに、私は火曜日11/8取得2011年10月27日水曜日の代わりに次の日付として/ 2011 ...実際に毎日今から10/26/2011が正しいピックアップをプロジェクト...そして10/27/2011から2までの各日付/ 28/2012は、水曜日ではなく火曜日を計画しています。そして、2012年2月29日(閏年)から2012年10月24日(午後10月)までの各日付は水曜日に正しく投影されます。私は何が欠けていますか?すべてのヘルプは非常にこれを行う最も簡単な方法は、setDateを使用してDateオブジェクトを更新です

V

+1

床に座ってはいけませんか?あなたが2011年6月1日を使用しているので、1:00u totalDaysは1になり、次のピックアップは火曜日に14日ではなく13日になります。 – Gerben

+0

奇妙に見えます。 'one_day = 1000 * 60 * 60 * 24;で正しい日付を取得しています。今日=新しい日付(2011,8,27); nextDate = getNextDate(new Date(2011,6,6)); '、nextDateはWed Sep 28 2011 00:00:00 GMT +'ですが、これは正しいですか? FF4でテスト済み。 – Raze

+0

startDateは常に新しい日付(2011,06,06) - 移動しないでください – user799301

答えて

34

..いただければ幸いです。この回答のコメントから明らかなように、これは正式に仕様の一部ではなく、すべての主要なブラウザでサポートされています。

NEVERDateオブジェクトを更新すると、元のgetDateが呼び出されたものよりもオブジェクトが更新されます。

サンプル実装:

var incrementDate = function (date, amount) { 
    var tmpDate = new Date(date); 
    tmpDate.setDate(tmpDate.getDate() + amount) 
    return tmpDate; 
}; 

日付をインクリメントしようとしている場合、この機能を使用してください。正と負の両方の値を受け入れます。また、使用された日付オブジェクトが変更されないことが保証されます。これにより、更新プログラムがオブジェクトの値を変更すると予想されない場合に発生する可能性のあるエラーを防止する必要があります。


誤った使用方法:

var startDate = new Date('2013-11-01T11:00:00'); 
var a = new Date(); 
a.setDate(startDate.getDate() + 14) 

これはaの値に基づいて、14日間でstartDateための "日付" 値を更新します。 aの値が前に定義されたstartDateと同じでないため、間違った値を取得する可能性があります。

+1

これを保証する文書を見つけることは容易ではありません一般的なケースで作業する(任意の日数を追加する)。 – nobar

+7

これは非常に危険な思考プロセスです。 「startDate」は今月の第1日であり、今日は第31日であるとします。あなたは開始日から7日前の日付を望みます。 a.setDate(startDate.getDate() - 7)で十分でしょうか?そんなに早くない。 'a'は、 'startDate'の7日前ではなく、現在の* monthの開始の7日前です。このページがGoogleの検索結果に表示される場所を考えると、これは理解するためには絶対に重要です。私はそのような問題を直ちに訂正しており、請負業者がこのページを見つけ、その正確なロジックに従っていることを強く疑っています。 – 10gistic

+0

うーん、私はあなたが記述した方法でこれを使用するつもりはありませんでした。 __updating__の日付値のみ。私はその問題を反映するために私の答えを変えます。 – Exelian

2

注:私も同様の問題がありました。私は毎週、すなわち、開始日10/23/2011と12週間行く日の配列を作成したいと思った。私のコードは、多かれ少なかれ、このでした:

var myDate = new Date(Date.parse(document.eventForm.startDate.value)); 
var toDate = new Date(myDate); 

var week = 60 * 60 * 24 * 7 * 1000; 
var milliseconds = toDate.getTime(); 

dateArray[0] = myDate.format('m/d/Y'); 

for (var count = 1; count < numberOccurrences; count++) { 
    milliseconds += week; 
toDate.setTime(milliseconds); 
    dateArray[count] = toDate.format('m/d/Y'); 
} 

私は時間を指定していないと私はアメリカに住んでいるので、私のデフォルトの時間は深夜だったので、私は夏時間の国境を越えたときに、私はに移動しました前日。ヤック私は週の計算をする前に正午に私の時間を設定することでそれを解決しました。あなたは(次の給料日のために、私の場合には)将来的に任意の期間を計算する場合、あなたは単純なループを行うことができ、Exellianの答えに拡大

4

var today = new Date(); 
var basePayDate = new Date(2012, 9, 23, 0, 0, 0, 0); 

while (basePayDate < today) { 
    basePayDate.setDate(basePayDate.getDate()+14); 
} 

var nextPayDate = new Date(basePayDate.getTime()); 
basePayDate.setDate(nextPayDate.getDate()-14); 

document.writeln("<p>Previous pay Date: " + basePayDate.toString()); 
document.writeln("<p>Current Date: " + today.toString()); 
document.writeln("<p>Next pay Date: " + nextPayDate.toString()); 

これはヒットしませんコア日付サービスが期待どおりに機能していると仮定すると、奇妙な問題が発生します。私は認めなければならない、私はそれを何年も前からテストしなかった...

関連する問題