【问题标题】:Get time difference (hours, seconds, minutes) between two different date strings in UTC获取 UTC 中两个不同日期字符串之间的时差(小时、秒、分钟)
【发布时间】:2020-08-28 21:20:13
【问题描述】:

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

*值得注意的是我需要在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 时间戳?
  • 让 timer = Math.abs(Date.now() - new Date(timeFromDataBase).getTime());你能提供一个 ""timeFromDataBase"" 的样本值吗,你正在使用?
  • "2020-05-12 18:04:25" 不是 ECMA-262 支持的格式,因此解析取决于实现。至少一个当前浏览器将返回无效日期,请参阅Why does Date.parse give incorrect results? 如果正确解析,它将被视为本地,而不是 UTC。您应该手动将其解析为 UTC,然后从 Date.now() 中减去它。将示例代码和数据作为文本而不是图像发布。

标签: javascript date time timezone utc


【解决方案1】:

问题是您来自数据库的数据不是正确的 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());

【讨论】:

  • 没有问题,我建议您尽可能通过应用程序坚持 ISO8601 格式。祝你好运。
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2012-05-19
  • 2011-07-29
  • 2014-01-17
相关资源
最近更新 更多