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

标签 javascript node.js datetime timezone momentjs

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

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

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

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

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

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

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

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

最佳答案

我最终弄清楚了如何同时使用 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')

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

干杯。

关于javascript - 在 Node.JS 中输出用户时区时间戳的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14237080/

相关文章:

javascript - 如何区分 '<li>'(无类/id)和 '<li class="hasClass">'?

node.js - 即使断言失败,Mocha 测试也会通过

javascript - Typescript 通用方法装饰器返回 Promise 作为值

node.js - NodeJS 应该是独立的吗(即没有 apache nginx)

python - 将 pandas 时间序列加入日期范围

SQL每天以30天的频率选择流失的客户

javascript - 出现在滚动问题上

javascript - 使用 jQuery 替换 href 属性中的子字符串

javascript - 如何检查 Firefox 扩展代码是否在特权模式下运行?

javascript - 如何按日期属性对对象数组进行排序?