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

时间:2013-09-11 22:30:19

标签: javascript datetime timezone 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);

尽管如此,timeAgo仍显示客户的时区与服务器的时区之间的差异(即显示'12小时前'而不是'现在');

任何人都知道如何解决这个或我做错了什么?

3 个答案:

答案 0 :(得分:10)

理想情况下,您希望将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();

您的其他代码无效的原因是因为在第一行中,您受浏览器时区的影响。第二行中的区域设置器只更改区域以进行格式化,而不是更改实际时刻。

此外,当您将某个时刻转储到控制台进行调试时,请确保将其格式化为输出。否则,您只是查看其内部属性值,这可能会或可能没有意义。

答案 1 :(得分:9)

我已经用不同的方式解决了这个问题,也许这个选项在提出问题时无法回复,但现在可能更容易了。

我使用moment-timezone.js(需要moment.js 2.6.0 +)。

我将默认时区设置为我的服务器时区,如下所示:

moment.tz.setDefault("America/New_York"); // "America/New_York" in my case

然后正常使用它。 fromNow()将使用客户端中的时区来计算自那时起已经过去的时间。

moment(myDatetime).fromNow();

答案 2 :(得分:1)

我有同样的问题,并使用上述注释来修改我的代码。我做了以下事情以解决它:

int compareWithDifferences(..., Iterable<Difference> differences);

在我应用.fromNow()

之前,我错过了.utc()来转换它

需要注意的事项是在Pipe for Ionic 3中使用,上面的代码来自管道逻辑。