我从服务器传回UTC日期,我需要一些JS来查找“now”和从服务器传回的日期之间的差异。
我正在尝试一下,比如
var lastUpdatedDate = moment(utcStringFromServer);
var currentDate = moment();
var diff = currentDate - lastUpdatedDate;
问题是,这给出了一个非常无效的答案,因为UTC从服务器下来,并且创建新的moment()
使其成为本地。如何针对完整的UTC进行计算,以便与任何本地时间无关?
答案 0 :(得分:2)
您不太了解的是日期存储为自UTC时间1970年1月1日午夜以来的毫秒数。在浏览器的本地时区中确定日期/时间时,首先计算出UTC时间的日期/时间,然后添加/减去本地时区偏移量。
当您使用+dateVar
或dateVar.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