使用带有from.ow()或from()的moment.js的时区

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)