2012-08-29 79 views
2

現在這個代碼適用於明天和下個月 - 週末使用的工作,除了現在接近月底導致錯誤。我的startdate設置爲8/31/12,enddate爲8/34/12(在Sql中將其轉換爲DateTime時,會顯示錯誤。)下週末的日期時間在JavaScript返回無效日期

我成功地在數學中添加一天,並且要添加一個月,但是在下個月增加幾天的時間就會中斷。我想我明白爲什麼這會發生,它是獲得日期 - 「29」把它變成int然後加上 - 我想我會在12月份的「下個月」遇到同樣的問題。

我的問題是什麼是正確的方式(或任何工作方式)將日期添加到JavaScript日期,它理解月份的日期。

 var d = new Date(); 
     var startdate; 
     var enddate; 

     if ($('._tomorrow').attr("checked") == "checked") { 
       startdate = [d.getMonth() + 1, d.getDate() + 1, d.getFullYear()].join('/'); 
       enddate = [d.getMonth() + 1, d.getDate() + 2, d.getFullYear()].join('/'); 
      } 
      if ($('._weekend').attr("checked") == "checked") { 
       startdate = [d.getMonth() + 1, d.getDate() + 6 - d.getDay(), d.getFullYear()].join('/'); 
       enddate = [d.getMonth() + 1, (d.getDate() + 6 - d.getDay()) + 2, d.getFullYear()].join('/'); 
      } 
      if ($('._nextmonth').attr("checked") == "checked") { 
       startdate = [d.getMonth() + 2, 1, d.getFullYear()].join('/'); 
       enddate = [d.getMonth() + 2, 29 , d.getFullYear()].join('/'); 
      } 

回答

0

要添加指定的天數,請創建一個新的Date對象,然後使用d.setDate(d.getDate() + n)其中n是需要添加的天數。

如果再次打電話getYear()getMonth()getDate()你會發現,他們都被「修正」爲有效值:

> d = new Date() 
Wed Aug 29 2012 20:57:12 GMT+0100 (BST) 
> [d.getDate(), d.getMonth() + 1] 
[29, 8] 
> d.setDate(d.getDate() + 10); 
1347134232993 
> [d.getDate(), d.getMonth() + 1] 
[8, 9] 

添加個月也不是那麼簡單的,因爲你需要定義什麼當下個月比當月短時發生 - 例如什麼日期是「1月31日之後一個月」?

儘管計算下個月的開始很容易!

var now = new Date(); 
var start = new Date(now.getFullYear(), now.getMonth(), now.getDate()); 
var end = new Date(now.getFullYear(), now.getMonth(), now.getDate()); 

if ($('._tomorrow').is(':checked')) { 
    start.setDate(now.getDate() + 1); 
     end.setDate(now.getDate() + 2); 
} else if ($('._weekend').is(':checked')) { 
    start.setDate(now.getDate() + 6 - now.getDay()); 
     end.setDate(now.getDate() + 8 - now.getDay()); 
} else if ($('._nextmonth').is(':checked')) { 
    start.setDate(1); 
     end.setDate(1); 
    start.setMonth(now.getMonth() + 1); 
     end.setMonth(now.getMonth() + 2); 
} 

var startStr = [start.getMonth() + 1, start.getDate(), start.getFullYear()].join('/'); 
var endStr = [end.getMonth() + 1, end.getDate(), end.getFullYear()].join('/'); 

http://jsfiddle.net/alnitak/nTSMg/

+0

你的工作也很好,幾乎一樣,Marc B更快 –

+0

我認爲Marc的答案是錯誤的 - 它試圖產生一個月的特定日期在未來,不是包含整個下一個整月(即從1日開始)的範圍。 – Alnitak

+0

是的,你得到它的權利 –

2

您需要建立一個新的日期對象,其中包含調整後的值。現在你只是隨機抽取一些數字並增加它們,例如

31+3/8/2012 -> 34/8/2012, not 3/9/2012 

做這樣的事情第一:

d.setMonth(d.getMonth()+ 2) 

內部JS會適當調整日/月/年佔「溢出」你會在每個週期結束時,仍然產生一個有效的日期。

+1

這可能是因爲你沒有在JavaScript聊天室談論brony的,讓你給我打個好答案 –

+0

d.setMonth(d.getMonth()的'結果+ 2)'如果新月比新舊月份短(例如,哪個日期是12月31日後的兩個月?),會產生意想不到的結果 – Alnitak

+0

@alnitak:無論如何,月份是一個時髦的概念,尤其是當您處理二月份時。 –