2013-01-09 52 views
1

中在用戶的時區輸出時間戳的最佳方式我的應用正在記錄某些用戶事件以便在UI中顯示。時間戳被存儲爲Mongo中的日期,它們成爲JS Date對象,其時區信息與服務器的時區相關。在Node.JS

我使用moment.js來格式化日期,但由於我的用戶在澳大利亞和我的應用程序託管在Heroku(服務器時區是UTC),那麼moment.js幫助輸出的'本地'時間不是什麼我的用戶希望看到。

Moment.js允許您在UTC和「本地」時間(在服務器上)之間切換,但似乎無法讓您在不同時區的上下文中輸出。

(更改服務器的時區解決不了根本問題,這也將是錯誤的,我的一些用戶。)

我曾嘗試使用node-time library改變對日的時區,如果它確實工作然後,我只需使用Date.toString()輸出時間戳,但如果日期被Moment.js包裝,它將恢復到服務器的時區。

我可以通過計算用戶本地時區和服務器本地時區之間的差異,並在Moment.js格式化之前修改日期來解決問題,但我希望有(a)更優雅的解決方案或者(b)一個好的圖書館可以做到這一點。

我也可以用UTC輸出日期,並讓客戶端庫重新格式化它們,但我更喜歡有服務器端解決方案。

是否有人知道這個好的解決方案,或者是一個能夠填補Node.JS應用程序缺口的庫?這是否有一個確定的最佳實踐?

+0

可能有幫助:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset –

+0

通常最好在節點上保留所有的UTC。js/server/API端,並使用標準日期方法在瀏覽器中使用JavaScript轉換爲用戶的TZ進行演示,這些方法能夠識別用戶的本地時區。 – JohnnyHK

+0

@JohnnyHK我正在尋找一種方法來做它的服務器端有幾個原因,包括顯示日期相對於用戶的已知時區(不一定是瀏覽器)。否則我一般同意你的看法。 –

回答

6

我最終弄清楚如何使用node-timemoment.js庫來創建一個相對優雅的解決方案。

我創建了一個模塊moment_tz.js像這樣:兩個時區之間

var moment = require('moment'), 
    time = require('time'); 

exports = module.exports = function(t,z) { 
    var tz = new time.Date(0, z); 
    return moment(t).add('minutes', t.getTimezoneOffset() - tz.getTimezoneOffset()); 
} 

它返回已更新的差(分鐘)一個moment對象。

下面是我在悉尼用它來輸出當前時間:

moment_tz(new Date(), 'Australia/Sydney').format('Do MMM \'YY - h:mm:ss a') 

如果有人有更好的解決方案,請讓我知道!

乾杯。

1

我知道它的一箇舊帖子,仍然可以幫助某人 MomentJs現在有一個時區功能。

http://momentjs.com/timezone/

var time = moment.tz(new Date(), timezone_string) /* timezone_string = "Australia/Sydney" */ 
var timestring = time.format('D/MM/YYYY hh:mm A') 

希望這有助於。