javascript - 在 moment.js fromNow() 或 from() 中使用时区

标签 javascript datetime timezone momentjs

我想向用户显示他们执行某项操作后已经过去了多长时间。

操作发生的日期+时间存储在服务器上,在服务器的时区中。这就是造成问题的原因,因为如果用户计算机的时区比服务器的时区早 12 小时,那么如果用户现在添加一些内容,moment.js 将显示“12 小时前”作为 fromNow() 的输出 而不是刚刚

为了解决这个问题,我正在尝试以下方法:

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,然后再通过网络发送。当然,如果您实际上以 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();

您的其他代码不起作用的原因是因为在第一行中,您受到浏览器时区的影响。第二行的zone setter只是改变了格式化的zone,并没有及时改变实际的时刻。

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

关于javascript - 在 moment.js fromNow() 或 from() 中使用时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752366/

相关文章:

java - 关键云类型转换厂的时区变化

javascript - 如何在 jquery 中添加带有图像 slider 的链接

javascript - 我在 NodeJS 中编写了 Mongodb 连接代码,它运行良好,但在 Jmeter 中失败

python - 使用 xlrd 从 excel 表中读取时间,时间格式而不是 float

MySql - 时间安排查询

datetime - 如何在 Xamarin 应用程序中的 XAML 中格式化日期和时间

c - 如何在 Win32 C 中将 GMT 转换为本地时间?

php - 如何为 php web 应用程序管理不同国家/地区的不同用户的时区?

javascript - 如何在 Laravel 中将变量从脚本传递到 Controller

javascript - 如何在javascript中的foreach语句中初始化id?