Cli*_*ote 11 javascript timezone datetime momentjs
我想向用户显示自执行操作以来已经过了多长时间.
发生操作的日期+时间存储在服务器的服务器时区中.这就是造成麻烦的原因,因为如果用户计算机的时区比服务器的时区提前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);
Run Code Online (Sandbox Code Playgroud)
但尽管如此,timeAgo仍然显示客户端的时区与服务器的时区之间的差异(即显示'12小时前'而不是'现在');
任何人都知道如何解决这个或我做错了什么?
Mat*_*int 12
理想情况下,您希望将UTC时间戳从服务器传递到客户端.这并不意味着您必须将整个服务器切换到UTC,这只是意味着您可以在通过Web发送之前将数据库中的时间转换为服务器上的UTC.当然,如果你实际存储了UTC时间,那会更好,但是你说你现在无法进行那种改变.但是,让我们假设您无法在服务器上进行任何更改.
我们还假设您的服务器固定为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();
Run Code Online (Sandbox Code Playgroud)
您的其他代码不起作用的原因是因为在第一行中,您受浏览器时区的影响.第二行中的区域设置器只更改区域以进行格式化,而不是更改实际时刻.
此外,当您将时刻转储到控制台进行调试时,请确保将其格式化为输出.否则,您只是查看其内部属性值,这可能会或可能没有直接意义.
fra*_*ner 10
我以不同的方式解决了这个问题,也许这个选项在提出问题时无法回复,但现在可能更容易了.
我使用了moment-timezone.js(需要moment.js 2.6.0+).
我将默认时区设置为我的服务器时区,如下所示:
moment.tz.setDefault("America/New_York"); // "America/New_York" in my case
Run Code Online (Sandbox Code Playgroud)
然后正常使用它.fromNow()将使用客户端中的时区来计算自那时起已经过去的时间.
moment(myDatetime).fromNow();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9431 次 |
| 最近记录: |