2014-04-19 63 views
4

在我的生產/ heroku應用程序中,下面的代碼返回的小時數比下面的代碼在我的開發/本地應用程序中運行時返回的小時數多7個小時。爲什麼是這樣?Heroku Timezone Issue with Moment.js

var startDate = moment.tz("2000-01-01", "America/Edmonton").startOf('day'); 
var endDate = moment.tz("America/Edmonton"); 

hourly_count = parseInt(endDate.diff(startDate, 'hours') + 1); 
+0

我也有類似的奇怪的事情發生。在我的開發機器的時刻(「APR 27,2014 12:00 PM」,['MMM DD,YYYY hh:mmA'])。valueOf()'給出了'1398621600000',但是在Heroku上它給出了'1398600000000'值。 – marknadal

+0

@marknadal - 這是一個不同的問題。您按照當地時間提供輸入。 'valueOf'總是給出一個時間戳,它反映了Unix時代以來的毫秒數,這是以UTC爲單位的。 –

回答

-1

您正在部署的目標機器可能是UTC,您將要設置它或使用Moment Timezone。 http://momentjs.com/timezone/

+0

這個問題已經通過使用'tz'函數顯示了使用時間 - 時區。 –

0

Heroku有一些問題。它會自動計算到UTC。

代碼

var tms = 1492554237000 

console.log(moment(tms).format("YYYY-MM-DD HH:mm:ss")) 
console.log(moment.utc(tms).format("YYYY-MM-DD HH:mm:ss")) 

本地輸出

2017-04-19 06:23:57 
2017-04-18 22:23:57 

Heroku的服務器輸出

2017-04-18 22:23:57 
2017-04-18 22:23:57 

我解決了它通過調整時間戳。

if (moment().utcOffset() == -0){ 
    // for server 
    tms += 28800000 
} 

Heroku的服務器輸出新

2017-04-19 06:23:57 
2017-04-19 06:23:57 
+0

這不是對問題的回答。你只是在觀察Heroku的* local *時區碰巧是UTC。問的問題是使用特定的*時區和時區。 –

+0

另外,他們調整的方式不正確。這將完全選擇不同的時間點。您在本地輸出中顯示的內容確實是我期望從任何位於UTC之前8小時的本地時區的計算機上看到的結果。 –

0

因爲您指定了一個名爲時區與矩時區,只有兩個具有本地計算機和服務器之間不同的結果,可能的原因:

  • 在一臺或兩臺設備上時鐘設置不正確。可能Heroku的時鐘很好,所以請檢查你的。

  • 您不會將任何時區數據加載到瞬時時區。在這種情況下,較早版本的moment-timezone會默默地回落到當地時間。較新的版本會出錯。

    您應該使用其中一個「with-data」發行版,或者通過moment.tz.add函數加載您感興趣的時區數據。

很可能是,因爲這個問題是在2014年寫的,這是第二個問題。