2013-04-07 26 views
0

我最近遇到一個問題,...確定當DST生效

可以說我有一些JavaScript這樣的,例如:

var timezone = -(new Date()).getTimezoneOffset()/60; // Get the TZ offset 

var local = []; 
var gmt = []; 

for(var i = 0; i <= 23; i++) // Loop through each hour 
{ 
    local.push(i); 

    var time = (i + timezone); 

    if(time == 24) 
     time = 0; 

    gmt.push(time); 
} 

這工作完全不同時,在DST ,但是當DST惡有惡報我有意想不到的效果,如這樣的:(本地用戶是GMT/DST)

> console.log(local); 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] 

> console.log(gmt); 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0] 

當兩個數組應該是相同的。

如何檢測夏令時是否生效?

+1

考慮到您正在使用的算法,結果似乎完全正確。它應該每天工作,除了穿越夏令時邊界時。也許你可以解釋你遇到的問題。 – 2013-04-07 16:51:34

+0

您的意思是當地時區是GMT/BST(與WET/WEST相同),是嗎? – 2013-04-07 16:51:50

+0

問題是應用程序應該檢測何時BST有效,並基本上將GMT更改爲BST @TomBlodget – 2013-04-07 17:24:29

回答

0

該功能將幫助您使用DST進行計算。

function dstOffset() { 
    var dailyOffsets = []; 
    for (var i = 0; i <= 366; i++) { // sample timezone offset over at least a year since daylight saving changes are repeated each year. 
     var sampleDay = new Date(); // today at whatever time 
     sampleDay.setDate(i); // i days from the begining of this month (at the same time) 
     dailyOffsets.push(sampleDay.getTimezoneOffset()); 
    } 
    return Math.min.apply(null, dailyOffsets); 
} 
alert(dstOffset() + " minutes"); 
+0

這會工作,但它肯定是一種強力方法。並沒有考慮到過去許多時區已經改變了它們的偏移量。到目前爲止,您的最佳建議是使用時區數據庫。最好是在服務器上執行此操作,但如果需要,還有一些可用於JavaScript。 – 2013-04-08 06:01:35

0

這是我最終得到,檢測三月的最後一個星期日,然後十月的最後一個星期日和檢查,如果我們中的那些日子裏,目前是。感謝您的意見和答覆,每個人。

隨意編輯,並給我建議/改進它。我有一種感覺,這不是最好的辦法。

function is_bst() 
{ 
    var date = new Date(); 
    var march = null; 
    var october = null; 

    for(var i = 7; i != 0; i--) 
    { 
     var day = new Date(date.getFullYear(), 2, i); 

     if(day.getDay() == 0) 
     { 
      march = day; 
      break; 
     } 
    } 

    for(var i = 7; i != 0; i--) 
    { 
     var day = new Date(date.getFullYear(), 9, i); 

     if(day.getDay() == 0) 
     { 
      october = day; 
      break; 
     } 
    } 

    return !(date < march || date > october); 
} 
+1

您的代碼太本地化了。在某些時候,這些代碼將由不在英國的人運行。在某些時候,英國將改變其DST法,後來JavaScript庫將更新以反映這一點。 – 2013-04-07 20:56:16

+0

有沒有辦法檢測一個定義的國家進入DST的時間? @TomBlodget – 2013-04-07 21:46:34

+0

請參閱我以前的解決方法。我不認爲JavaScript中有時區數據庫。 – 2013-04-07 22:01:51