首页 文章

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

提问于
浏览
1

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

我正在使用moment.js来格式化日期,但由于我的用户在澳大利亚并且我的应用程序托管在Heroku(服务器时区是UTC),因此当时.js帮助输出的'local'时间不是我的用户想要看到的 .

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

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

我曾尝试使用node-time library来更改日期的时区,如果我只是使用Date.toString()输出时间戳,这确实有效,但如果日期被Moment.js包装,它将恢复为服务器的时区 .

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

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

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

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

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

    干杯 .

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

    希望这可以帮助 .

相关问题