2011-06-15 25 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)); 

到目前爲止好......但是當我 「今天」 工程10/27/2011,我得到11/8星期二/ 2011作爲下一個日期,而不是2011年11月9日星期三...實際上,從現在到2011年10月26日,每一天都計劃正確的接機...以及從10/27/2011到2的每個日期/ 28/2012項目週二而不是週三。然後每個從2012年2月29日(閏年)到2012年10月24日(嗯,十月再次)的日期正確投影星期三。我錯過了什麼?任何幫助將不勝感激..

V

+1

不應該是地板?因爲你使用2011-06-06 1:00u totalDays將是1,並且下一次取件將在13天而不是14天,因此是星期二。 – Gerben 2011-06-15 10:33:32

+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 2011-06-15 11:00:18

+0

startDate總是新的日期(2011,06,06) - 所以它不應該移動 – user799301 2011-06-15 11:12:46

回答

34

做,這是更新使用setDateDate對象的最簡單方法。正如這個答案的評論表明這不是規範的正式部分,但它在所有主流瀏覽器上都受支持。

你應該從不更新不同Date對象比你原來的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價值startDate 14天內更新的 「日期」 值。因爲a的值與先前定義的startDate不同,所以可能會得到錯誤的值。

+1

找到確保這樣做的文檔並不容易在一般情況下工作(增加任意天數)。 – nobar 2013-02-04 02:52:17

+7

這是一個非常危險的思考過程。想象一下'startDate'是在這個月的第一天,今天是第31位。你想從startdate返回7天的日期。 a.setDate(startDate.getDate() - 7)就足夠了吧?沒那麼快。 'a'現在是* current *月份開始前7天,而不是'startDate'前7天。考慮到這個頁面在Google搜索結果中出現的位置,這對理解這一點非常重要。我現在正在糾正這個問題,並強烈懷疑我們的承包商找到了這個頁面,並遵循了確切的邏輯。 – 10gistic 2013-10-31 17:03:55

+0

嗯,我從來沒有打算以你所描述的方式來使用它。僅用於__updating__日期值。我會改變我的答案來反映這個問題。 – Exelian 2013-11-01 13:51:42

2

注:我有一個類似的問題;我想每週創建一組日期,即開始日期爲2011年10月23日,並持續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'); 
} 

因爲我沒有指定的時間和我住在美國,我的默認時間爲午夜,所以當我衝過夏令時間邊界,我搬進了前一天。呸。我通過設定每天的時間到中午來解決這個問題,然後再進行一週的計算。

4

擴展在Exellian的答案,如果你要計算在未來的任何時間(在我的情況下,下一個付息日),你可以做一個簡單的循環:

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()); 

這不會打假設核心日期服務按預期工作,則會出現奇怪的問題。我必須承認,我未來多年未對它進行測試......