2013-10-15 101 views
0

我正在嘗試編寫一段JavaScript代碼,它將在一天中的兩個小時之間顯示特定的消息。我們處於東部標準時間,但我在使用世界時間方面沒有問題,因爲這使得編寫腳本變得更容易。到目前爲止,我有這個,它的工作很好,但是,我完全不知道如何處理夏令時。通用時間,夏令時和JavaScript

$(document).ready(function(){ 
    var todaysDate = new Date(); 
    var weekday = todaysDate.getDay(); 
    var universalhour = todaysDate.getUTCHours(); 

if (weekday >= 0) { 
    if (weekday <= 4) { 
     if (universalhour >= 14) { 
      if (universalhour < 23) { 
       $('div#announcements span').append('<br />Open.'); 
      } 
     } 
    } 
} 
if (weekday == 5) { 
    if (universalhour >= 14) { 
     if (universalhour < 20) { 
      $('div#announcements span').append('<br />Open.'); 
     } 
    } 
} 
}); 

基本上,消息「打開」應僅上午10點EST和下午8點EST,週日至週四和上午10點之間EST到下午4點顯示EST星期五。

我與UST合作沒有問題,我只需要幫助找出夏令時的解決方法,因爲這超出了我的知識領域。

+0

'getDay'不是_UTC_版本,所以取決於位置,也許你的意思是'getUTCDay'。 –

+1

您可以檢查DST是否有效http://stackoverflow.com/questions/11887934/check-if-daylight-saving-time-is-in-effect-and-if-it-is-for-how-many -hours – jorgebg

+0

@jorgebg僅適用於客戶端計算機上的本地時區。並非每個地方都會同時更改爲_DST_,有些地方根本不會。 –

回答

0

案例1

如果您的計算機設置爲在東部時區運行,並使用這一變化:

var hour = todaysDate.getHours(); 

然後使用該變量在所有的測試。

這應該照顧它。

案例2

如果你正在編寫的JavaScript在一些網絡/互聯網連接的最後一個客戶端機器上運行,則需要從服務器的東西傳遞給客戶端,以便在JavaScript可以 告訴東部時區的時間。

所以,你可以在您的網頁下面

<script> 
    // The global value is filled in by the server based on current time on your server which is 
    // running EST or can calculate it. That code might be PHP or Java or Ruby or ... 
    var ESTOffset = 5.0; 
</script> 

然後,你必須使用這樣的計算:

var hour = todaysDate.getUTCHours() + ESTOffset; 

有關困難的部分是爲你顯示消息和預計它會根據東部時間改變。如果用戶彈出頁面並將其保留,直到DST開始在EST中,該怎麼辦?你需要處理嗎?如果它在美國東部時間下午2點左右出現並且該頁面彈出,該怎麼辦?幾分鐘後你需要彈出消息嗎?

案例3

你有麻煩了,如果你需要弄清楚EST時間,包括DST,運行的任意時間區中的計算機上。 JavaScript中沒有任何東西可以讓你問「在美國紐約幾點鐘?」。您需要一些知道規則的圖書館,如果規則在美國東部時間發生變化,您將不得不更新(或確保獲得更新)。或者你可以自己添加一些代碼,知道當DST在EST開始和結束並執行數學計算時。當然,如果規則改變,你必須更新代碼。

+0

大聲笑,到最後一部分。不幸的是,我無法控制我的服務器,所以我留下了一些我不擅長的JavaScript黑客攻擊。 – henryaaron

0

這是最簡單的一個圖書館。使用moment.jsmoment-timezone

$(document).ready(function(){ 

    var now = moment().tz("America/New_York"); 
    var weekday = now.day(); 
    var hour = now.hour(); 

    var isOpen = (weekday >= 0 && weekday <= 4 && hour >= 10 && hour < 20) || 
       (weekday == 5 && hour >= 10 && hour < 16); 

    if (isOpen) { 
     $('div#announcements span').append('<br />Open.'); 
    } 
}); 

一定要包括從time zone data builderAmerica/New_York區中的數據。這是美國東部時間的IANA時區標識符。

這裏的主要優點是,您可以根據當地時間來表示您的小時數,它會自動考慮夏令時的任何變化。換句話說,這些時間在美國的「東部時間」地帶,而不是專門在「東部標準時間」或「東部夏令時」。

+0

不要忘記,如果東部時區的DST規則發生變化,那麼在將來某個時間不確定的時間內,情況將需要更新。 –

+0

@LeeMeador - 好點。這就是爲什麼每年都有多個TZDB更新的原因。幸運的是,在美國,他們傾向於事先宣佈這些事情,但在世界某些地區,他們可能會在短時間內發生變化。 –