2

我的应用正在记录某些用户事件以在 UI 中显示。时间戳作为日期存储在 Mongo 中,成为 JS Date 对象,时区信息与服务器的时区相关。

我正在使用moment.js来格式化日期,但是由于我的用户在澳大利亚并且我的应用程序托管在Heroku上(服务器时区是 UTC),moment.js 有用输出的“本地”时间不是我的用户想看。

Moment.js 允许您在 UTC 和“本地”时间(在服务器上)之间切换,但似乎不允许您在不同时区的上下文中输出。

(更改服务器的时区并不能解决根本问题,对我的一些用户来说也是错误的。)

我尝试使用节点时间库来更改日期的时区,如果我随后使用 Date.toString() 简单地输出时间戳,这确实有效,但如果日期由 Moment.js 包装,它会恢复为服务器的时区。

我可以通过计算用户本地时区和服务器本地时区之间的差异并在 Moment.js 格式化之前修改日期来解决解决方案,但我希望有(a)更优雅的解决方案,或者(b ) 一个很好的图书馆,可以做到这一点。

我也可以以 UTC 格式输出日期并让客户端库重新格式化它们,但我更希望有一个服务器端解决方案。

有没有人知道一个很好的解决方案,或者一个为 Node.JS 应用程序填补这个空白的库?对此是否有既定的最佳实践?

4

2 回答 2

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')

如果有人有更好的解决方案,请告诉我!

干杯。

于 2013-01-09T15:33:52.820 回答
2

我知道它是一个旧帖子,但这可能会帮助 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')

希望这可以帮助。

于 2015-05-16T07:35:44.270 回答