在Node.JS中输出用户所在时区时间戳的最佳方法
Best way to output a timestamp in the user's timezone, in Node.JS
我的应用程序正在记录某些用户事件以在UI中显示。时间戳在Mongo中作为日期存储,成为JS Date对象,带有相对于服务器时区的时区信息。
我使用moment.js来格式化日期,但由于我的用户在澳大利亚,我的应用程序托管在Heroku上(服务器时区是UTC), moment.js有用输出的"本地"时间不是我的用户想要看到的。
Moment.js允许您在UTC和'本地'时间(服务器上)之间切换,但似乎不允许您在不同时区的上下文中输出。
(更改服务器的时区并不能解决根本问题,对于我的一些用户来说,这也是错误的。)
我尝试使用node-time库来更改日期上的时区,如果我然后简单地使用date . tostring()输出时间戳,这确实有效,但如果日期被Moment.js包装,它会恢复到服务器的时区。
我可以通过计算用户本地时区和服务器本地时区之间的差异并在Moment.js格式化之前修改日期来解决这个问题,但我希望有(a)一个更优雅的解决方案,或者(b)一个好的库可以做到这一点。
我也可以输出UTC格式的日期,让客户端库重新格式化,但我更喜欢服务器端解决方案。
有没有人知道一个很好的解决方案,或者一个库,填补这个空白的Node.JS应用程序?这方面有既定的最佳实践吗?
我最终想出了如何使用node-time和moment.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')
如果有人有更好的解决方案,请告诉我!欢呼。
我知道这是一个旧的帖子,但这可能会帮助一些人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')
- 如何每10.6秒从时间戳增加+1
- 使用AngularJS从时间戳中获取工作日
- 将时间戳转换为java中的ISO860,
- Javascript Unix时间戳转换
- JavaScript JSON关联对象键和值都作为日期时间戳
- 时间戳与mongoskin如何
- 用时间戳获取两个不同日期之间的时间差
- JavaScript到PHP的时间戳失败,增加了大约一个半月的时间
- 转换unix时间戳转换
- 带有unix时间戳的d3.js平分线
- 当转换为Python日期时间时,Node的时间戳落后3分钟
- 如何检索AMD的XHR响应代码(+时间戳)'大型Dojo
- javascript时间戳插入字符串变量
- Moment.js unix时间戳,以分钟为单位显示以前的时间
- 事件时间戳谷歌分析
- 将时间戳发送到 JavaScript 的最佳格式
- JavaScript:时间戳的最佳格式
- 将unix时间戳转换为javascript日期时间的最佳方法
- 获得准确时间戳的最佳方法
- 在Node.JS中输出用户所在时区时间戳的最佳方法