首页 > 解决方案 > 获取 UTC 中两个不同日期字符串之间的时差(小时、秒、分钟)

问题描述

我需要跟踪用户执行一项任务的时间。因此,我想获得用户登录时间与当前时间之间的确切时间差。用户登录的时间来自数据库。

*值得注意的是我需要在UTC工作。

从数据库中它是这样的,它已经在UTC:2020-05-12 18:04:25

这就是我或多或少尝试做的事情:

let timer = Math.abs(Date.now() - new Date(timeFromDataBase).getTime());

let minutes = Math.floor(timer / 60000);
let seconds = ((timer % 60000) / 1000).toFixed(0);

毫无疑问,分钟和秒的数量需要增加,但由于某种原因,它们对我来说一直在减少(并且转动 date.now() 和其他变量不是解决方案)!我将附上我的控制台日志的图片(这样你就可以看到数字是如何下降的,即使经过了更多的时间,它们应该会上升):

在此处输入图像描述

我显然错过了一些东西,但我看不到什么。我认为这可能是 Date.now() 给了我当地时间的毫秒数,而我在 UTC 中需要它们(如果是这种情况,我仍然找不到该怎么做)。

标签: javascriptdatetimetimezoneutc

解决方案


问题是您来自数据库的数据不是正确的 UTC 格式,因此该值被解释为本地时间——这就是您看到负值的原因。

当时区偏移不存在时,仅日期形式被解释为 UTC 时间,而日期时间形式被解释为本地时间。

所以你的价值2020-05-12 18:04:25最终可能是未来的时间,这取决于你在哪里。

您需要返回 UTC 格式的字符串,包括来自 db 的偏移量信息 - 或者:(Z 或 +hh:mm 或 -hh:mm),或者在客户端上重建该字符串。

演示:

const dbDate = new Date('2020-05-12 18:04:25');
console.info(dbDate.toUTCString()); // future for me in US
console.info(Date.now() - dbDate.getTime()); // negative value for me in US

const utcDate = new Date('2020-05-12T18:04:25.000+00:00');
console.info(utcDate.toUTCString());
console.info(Date.now() - utcDate.getTime());

const utcDateZ = new Date('2020-05-12T18:04:25.000z');
console.info(utcDateZ.toUTCString());
console.info(Date.now() - utcDateZ.getTime());


推荐阅读