在Node.JS中输出用户时区中的时间戳的最佳方法
我的应用程序正在logging某些用户事件以在UI中显示。 时间戳被存储为Mongo中的date,这些date成为JS Date对象,带有与服务器时区相关的时区信息。
我使用的是moment.js来格式化date,但由于我的用户在澳大利亚,我的应用程序托pipe在Heroku (服务器时区是UTC),那么moment.js帮助输出的“本地”时间不是我的用户想看看。
Moment.js允许您在UTC和“本地”时间(在服务器上)之间切换,但似乎不允许您在不同时区的上下文中输出。
(更改服务器的时区不能解决潜在的问题,这对我的一些用户也是错误的。)
我试图使用节点时间库来更改date的时区,如果我然后简单地使用Date.toString()输出时间戳,但是如果date被Moment.js包装,它会恢复到服务器的时区。
我可以通过计算用户本地时区和服务器本地时区之间的差异来修改一个解决scheme,并在Moment.js格式化之前修改date,但是我希望有一个更优雅的解决scheme,或者(b) )一个好的图书馆,将这样做。
我也可以输出UTC的date,让客户端库重新格式化他们,但我更喜欢有一个服务器端的解决scheme。
有没有人知道一个很好的解决scheme,或者一个库,填补Node.JS应用程序的差距? 有没有一个确定的最佳做法呢?
我最终弄清楚了如何使用node-time和moment.js库来创build一个相对优雅的解决scheme。
我创build了这样一个模块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')
如果有人有更好的解决scheme,请让我知道!
干杯。
我知道它是一个旧的post,但这仍然可以帮助MomentJs现在有一个时区function。
var time = moment.tz(new Date(), timezone_string) /* timezone_string = "Australia/Sydney" */ var timestring = time.format('D/MM/YYYY hh:mm A')
希望这可以帮助。