【问题标题】:(getTime() - 5 * 3600 * 1000) takes 3 hours back and not 5(getTime() - 5 * 3600 * 1000) 需要 3 小时而不是 5
【发布时间】:2022-01-11 00:35:44
【问题描述】:

我正在尝试查询 5 小时前的小时的统计信息。

当我运行这段代码时,我在日志中看到当地时间是 6,所以我希望 pastHour 是 1,但它显示的是 3。

为什么?

var HOURS_BACK = 5;

function main() {

  var past = new Date(new Date().getTime() - HOURS_BACK * 3600 * 1000);
  var pastHour = past.getHours();
  var pastDateStr = getDateStringInTimeZone(past, 'yyyy-MM-dd');
  query = "SELECT customer.id, metrics.impressions, segments.hour FROM customer WHERE metrics.impressions = 0 AND segments.hour = " + pastHour + " AND segments.date = '" + pastDateStr + "'";
  Logger.log("query " + query);
  }

【问题讨论】:

  • 罪魁祸首可能是你的getDateStringInTimeZone() 函数。当你测试你的代码时,想想你在世界的什么地方。
  • 不过,@Pointy pastHour 应该仍然是正确的。
  • 好吧,pastHour 取决于当前时间。如果当前是 2022-01-20T08:00:00,则 currentTime - 5 hours 将是 2022-01-20T03:00:00getHours 将返回 3。我真的不明白你在问什么。
  • 再次,您的本地时区是什么? .getHours() 返回您的 本地 小时,而不是 UTC 小时。
  • 只需打印 past.getHours()new Date().getHours(),您会发现它们相差 5。问题是 getDateStringInTimeZone 没有达到您的预期。

标签: javascript date google-ads-script


【解决方案1】:

edit — 我将在下面留下内容,但我现在认为问题中发布的内容无法解释 OP 的奥秘。


请务必牢记 Date 值的工作方式。在内部,日期始终是相对于 UTC 的时间戳。也就是说,如果(假设地)您和来自您的世界各地的某人同时 致电new Date().getTime(),那么你们都将获得相同的时间戳。 (显然不可能,但想象一下你生活在卡通世界中。)

但是,像 .getHours() 这样的日期 API 在您的 本地 时间工作。本地时间和世界时间的差异一直让很多人感到困惑,当您的日期/时间值随后涉及数据库操作时,情况只会变得更糟,同样的问题可能会再次出现。

【讨论】:

  • 这并没有解释为什么 OP 看到不正确的值。 OP 中没有任何内容表明为什么会显示错误的值(3 而不是 13)。这不是因为 OP 直接调整时间值然后读取本地时间,因为用于比较的时间戳也是本地的。这也不能归咎于 getDateStringInTimeZone,因为该函数在设置 pastHour 的值中没有任何作用。
  • @RobG 因为这是一个社区 wiki 答案,欢迎您继续并将您的反馈直接纳入答案中。..
  • @BenjaminGruenbaum — 我会这样做,但 OP 中没有足够的信息来确定问题发生的原因,因此无法回答,因此我投票结束。
  • @RobG 我理解你的情绪,确实这可能不是一个很好的提问方式,但我怀疑这是一个相当普遍的问题,人们可能会用谷歌搜索
  • 嘿伙计,我承认再看一遍,整个事情很难理解,当然也很难重现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多