javascript - 获取 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 格式,因此该值被解释为本地时间——这就是您看到负值的原因。
当时区偏移不存在时,仅日期形式被解释为 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());
推荐阅读
- python - Python/Django 使用 Through 保存 m2m
- php - 如何使用 PHP 7 中的 mpdf 库在同一个文件中调用 WriteHtml() 函数两次来编写内容?
- keycloak - Keycloak:为用户账户信息添加通用属性
- symfony-1.4 - 是否可以使用 Symfony 1.4 中的 schema.yml 更新数据库结构?
- android - 物理和虚拟设备上的应用显示错误
- java - 具有后备存储的功能数据结构
- sql - 根据列查找另一个表中不存在的数据
- python - 如何在网格中为点列表进行二维插值
- html - 位置相对/绝对
- multi-tenant - 在 Auth0 中,每个租户都有自己的实例吗?