获取 UTC 中两个不同日期字符串之间的时差(小时、秒、分钟)

Get time difference (hours, seconds, minutes) between two different date strings in 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 时间的毫秒数(如果是这种情况,我仍然找不到如何去做)。

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

When the time zone offset is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as local time.

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

您需要 return UTC 格式的字符串,包括来自数据库的偏移量信息 - 或者:(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());