2012-06-13 73 views
0

我想創建兩個包含一個月的開始日期和下一個月的開始日期的日期。這是我的:JavaScript日期操作怪異

var TheMonth = "6.2012"; // as in june 2012 
TheMonth = TheMonth.split(".") 

var TheDisplayDate = new Date(parseInt(TheMonth[1], 10), (parseInt(TheMonth[0], 10) - 1), 1); 

var TheUpperLimit = new Date(TheDisplayDate.getFullYear(), TheDisplayDate.getMonth(), 1); 

//I'm adding a month here but it's not changing the month 
TheUpperLimit.setMonth(TheUpperLimit.getUTCMonth() + 1); 

問題是TheUpperLimit原來是相同的日期。我有一個小提琴here來看看。 我在做什麼錯?

謝謝。

回答

1

的問題是,你使用getUTCMonthsetMonth而不是setUTCMonth。僅使用UTC或僅使用非UTC方法更爲正確。當您使用setMonthgetMonth時,它似乎工作正確。但是當你使用這些函數的UTC變體時,它會給你2 jul而不是1 jul(至少在我的時區內)。我建議你使用下面的代碼,以避免併發症時間:

var TheMonth = "6.2012"; // as in june 2012 
TheMonth = TheMonth.split("."); 
var month = parseInt(TheMonth[0]); 
var year = parseInt(TheMonth[1]); 
var second_month = month + 1; 
var second_year = year; 
if (second_month > 12) { 
    second_month = 1; 
    second_year++; 
} 

var TheDisplayDate = new Date(year, month - 1, 1); 
var TheUpperLimit = new Date(second_year, second_month - 1, 1); 
console.log([TheDisplayDate, TheUpperLimit]); 
// => [Date {Fri Jun 01 2012 00:00:00 GMT+0400 (MSK)}, 
//  Date {Sun Jul 01 2012 00:00:00 GMT+0400 (MSK)}] 
+0

好的,這是解決同一問題的另一種方式。我想出了我的問題:getUTCMonth實際上是選擇5月31日,因爲時區更改,並增加一個月到五月再次顯示六月。您的解決方案避免了這個問題;謝謝。 – frenchie

+0

當'TheMonth =「12.2012」','month = 12'和'second_month = month + 1 = 13'時。 'second_month> 12'條件只會在第12個月滿足。 –

1

根據你的暱稱(@frenchie),當地的時間大概是法國人的時間。這意味着GMT + 2:00

當設置,例如:

new Date(2012,5,1) 

這意味着你必須:

year=2012, month=June, day=1, hours=minutes=seconds=mseconds=0 

由於GMT + 2:00UTC Date將有-2小時偏移。如果你想做TheUpperLimit.toString(),你會看到,你有Thu, 31 May 2012 22:00:00 GMT。這意味着,您的UTC Month是'4'。所以當你添加'+1'時,你會在月份得到'5',而這是6月。所以沒有什麼奇怪的。

+0

是的,我想通了;看到上面的評論。我決定採用建議的解決方案來避免這個時區問題。 – frenchie

+0

@frenchie當我寫我的答案時,我沒有注意到你的評論。 :) – Engineer

+0

沒有概率,感謝您的幫助;我積極努力! – frenchie