在Node.JS中输出用户时区的时间戳的最佳方法

时间:2013-01-09 14:08:31

标签: javascript node.js datetime timezone momentjs

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

我正在使用moment.js格式化日期,但由于我的用户位于澳大利亚且我的应用程序托管在Heroku上(服务器时区为UTC),因此该时刻为“本地”时间。 js帮助输出不是我的用户想要看到的。

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

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

我曾尝试使用node-time library来更改日期的时区,如果我只是使用Date.toString()输出时间戳,则可以正常工作,但如果日期由Moment.js包装,它会恢复到服务器的时区。

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

我还可以输出UTC中的日期并让客户端库重新格式化,但我更愿意使用服务器端解决方案。

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

2 个答案:

答案 0 :(得分: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 :(得分: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')

希望这有帮助。