繁体   English   中英

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

[英]Using timezones with moment.js fromNow() or from()

我想向用户显示自执行操作以来已经过了多长时间。

发生操作的日期+时间存储在服务器的服务器时区中。 这就是造成麻烦的原因,因为如果用户的计算机的时区比服务器的时区提前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,这只是意味着您可以在通过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();

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

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

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

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

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

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

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

moment(myDatetime).fromNow();

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

  transform(value: string) {
    var time = moment(value).utc();
    return moment(time, "YYYYMMDD").fromNow();
  }

在应用.fromNow()之前,我错过了.utc()来转换它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM