使用UTC存储在服务器上的JS日期计算?

时间:2016-08-19 04:09:38

标签: javascript momentjs

我从服务器传回UTC日期,我需要一些JS来查找“now”和从服务器传回的日期之间的差异。

我正在尝试一下,比如

var lastUpdatedDate = moment(utcStringFromServer);
var currentDate = moment();
var diff = currentDate - lastUpdatedDate;

问题是,这给出了一个非常无效的答案,因为UTC从服务器下来,并且创建新的moment()使其成为本地。如何针对完整的UTC进行计算,以便与任何本地时间无关?

3 个答案:

答案 0 :(得分:2)

您不太了解的是日期存储为自UTC时间1970年1月1日午夜以来的毫秒数。在浏览器的本地时区中确定日期/时间时,首先计算出UTC时间的日期/时间,然后添加/减去本地时区偏移量。

当您使用+dateVardateVar.valueOf()或类似内容将日期重新转换为数字时,它会回到自01/01 / 1970T00:00:00Z以来的毫秒数。

关于这一点的好处是,无论何时以UTC格式化日期(作为数字或ISO字符串格式),当它被Javascript的Date对象自动转换为本地时间时,它就是与原始值相同的时间点,仅在当地时间表示。

因此,在您的情况下,当您将本地日期转换为数字时,您将获得UTC的毫秒值,您将以毫秒为单位减去UTC中的值。结果将是从服务器到调用new Date()的时间之间经过的毫秒数。

如果您想要从服务器将时间戳而不是转换为本地时间,那么它变得棘手,因为无论时区如何,您都希望显示相同的小时和分钟。但在这种情况下,这不是你需要的。

答案 1 :(得分:0)

尝试这种方式希望它有所帮助:

    var lastUpdatedDate = moment(utcStringFromServer);
    var date = Date.UTC();
    var currentDate = moment(date);
    var diff = currentDate - lastUpdatedDate;

答案 2 :(得分:0)

我假设utcStringFromServer是这样的:

Fri, 19 Aug 2016 04:27:27 GMT

如果是这样的话,你根本不需要Moment.js。如果将该字符串传递给Date.parse(),它将返回自1970年1月1日以来的毫秒数。然后,您可以使用.toISOString()方法立即获取相同的信息(已转换)到UTC)并以相同的方式解析它自1970年以来获得毫秒。然后,你可以从后者中减去前者并将其除以1000以转换回秒。

总而言之,它看起来像这样:

var lastUpdatedDate = Date.parse(utcStringFromServer);
var currentDate = Date.parse((new Date()).toISOString())
var diff = (currentDate - lastUpdatedDate) / 1000.0; // Convert from milliseconds