(getTime() - 5 * 3600 * 1000) 需要 3 小时而不是 5
(getTime() - 5 * 3600 * 1000) takes 3 hours back and not 5
我正在尝试查询 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);
}
edit — 我将保留下面的内容,但我现在认为问题中发布的内容无法解释 OP 的奥秘。
牢记日期值的工作原理很重要。在内部,日期是 总是 一个 UTC 相对时间戳。也就是说,如果(假设地)您和世界各地的某个人 同时 呼叫 new Date().getTime()
,你们将获得相同的时间戳。 (显然不太可能,但想象一下你生活在卡通世界中。)
但是,像 .getHours()
这样的日期 API 在您的 本地 时间工作。当地时间和世界时的差异一直让很多人感到困惑,当你的 date/time 值随后涉及数据库操作时,情况只会变得更糟,同样的问题可能会再次出现。
我正在尝试查询 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);
}
edit — 我将保留下面的内容,但我现在认为问题中发布的内容无法解释 OP 的奥秘。
牢记日期值的工作原理很重要。在内部,日期是 总是 一个 UTC 相对时间戳。也就是说,如果(假设地)您和世界各地的某个人 同时 呼叫 new Date().getTime()
,你们将获得相同的时间戳。 (显然不太可能,但想象一下你生活在卡通世界中。)
但是,像 .getHours()
这样的日期 API 在您的 本地 时间工作。当地时间和世界时的差异一直让很多人感到困惑,当你的 date/time 值随后涉及数据库操作时,情况只会变得更糟,同样的问题可能会再次出现。