Javascript 在用户';s时区,在Node.JS中

Javascript 在用户';s时区,在Node.JS中,javascript,node.js,datetime,timezone,momentjs,Javascript,Node.js,Datetime,Timezone,Momentjs,我的应用程序正在记录某些用户事件,以便在UI中显示。时间戳被存储为Mongo中的日期,它成为JS Date对象,带有相对于服务器时区的时区信息 我正在使用设置日期格式,但由于我的用户在澳大利亚,并且我的应用程序托管在(服务器时区为UTC),moment.js有用地输出的“本地”时间并不是我的用户希望看到的 js允许您在UTC和“本地”时间(在服务器上)之间切换,但似乎不允许您在不同时区的上下文中输出 (更改服务器的时区并不能解决根本问题,对我的一些用户来说也是错误的。) 我曾尝试使用更改日期的时

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

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

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

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

我曾尝试使用更改日期的时区,如果我使用date.toString()简单地输出时间戳,这是可行的,但是如果日期被Moment.js包装,它将恢复到服务器的时区

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

我还可以以UTC格式输出日期,并让客户端库重新格式化日期,但我更喜欢服务器端解决方案


有没有人知道一个很好的解决方案,或者一个库来填补Node.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_tz(new Date(), 'Australia/Sydney').format('Do MMM \'YY - h:mm:ss a')
如果有人有更好的解决方案,请告诉我


干杯。

我知道这是一个老帖子,不过这可能会帮助一些人 MomentJs现在具有时区功能


希望这会有所帮助。

可能会有所帮助:通常最好将node.js/server/API端的所有内容都保留为UTC,并使用标准的
Date
方法在浏览器中使用JavaScript转换为用户的TZ,该方法可以识别用户的本地时区。@JohnnyHK我正在寻找一种在服务器端执行此操作的方法有几年的时间原因,包括显示相对于用户已知时区(不一定是浏览器时区)的日期。否则我大体上同意你的意见。@PaulS。如果我最终创建了一个模块来实现这一点,那肯定会有所帮助。干杯
var time = moment.tz(new Date(), timezone_string) /* timezone_string = "Australia/Sydney" */
var timestring = time.format('D/MM/YYYY hh:mm A')