我想向用户展示自他们执行操作以来已经过去了多长时间。
发生操作的日期+时间存储在服务器上,采用服务器的时区。这就是造成问题的原因,因为如果用户计算机的时区比服务器时区早 12 小时,那么如果用户现在添加某些内容,moment.js 将显示“12 小时前”作为输出fromNow()
而不是just now
.
为了尝试解决这个问题,我正在尝试以下方法:
var actionTime = moment( action.timeStamp);//time of when user performed action
var serverTime = moment().zone('-07:00'); //current server time
console.debug( serverTime);//outputs Wed Sep 11 2013 15:19:51 GMT-0700
var timeAgo = serverTime.from( actionTime);
但尽管如此,timeAgo
仍然显示客户端时区和服务器时区之间的差异(即显示“12 小时前”而不是“现在”);
有人知道如何解决这个问题或者我做错了什么吗?
理想情况下,您希望将 UTC 时间戳从服务器传递到客户端。这并不意味着您必须将整个服务器切换为 UTC,它只是意味着您需要先将数据库中的时间转换为服务器上的 UTC,然后再通过网络发送。当然,如果你真的这么做就更好了storedUTC 时间,但您说您现在无法进行此类更改。但是,让我们假设您根本无法更改服务器上的任何内容。
我们还将假设您的服务器是fixed到 UTC-07:00 偏移量。在现实生活中,这只适用于像亚利桑那州这样不遵循夏令时的地方。因此,如果您位于洛杉矶且采用太平洋时间,那么您的部分数据基于 UTC-07:00,但部分数据基于 UTC-08:00。如果你想用 JavaScript 来做这件事,就需要做更多的工作。
我们还假设输入已经是 ISO8601 格式的字符串。 (如果不是,请告诉我,我将调整此代码。)
var s = "2013-09-11 18:00:00"; // from action.timeStamp
var actionTime = moment(s + "-07:00", "YYYY-MM-DD HH:mm:ssZ");
var timeAgo = actionTime.fromNow();
您的其他代码不起作用的原因是因为在第一行中,您受到浏览器时区的影响。第二行中的区域设置器仅更改格式化区域,而不更改实际时间。
另外,当您将片刻转储到控制台进行调试时,请确保对其进行格式化以进行输出。否则,您只是查看其内部属性值,这可能直接有意义,也可能没有直接意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)