如果是伦敦的凌晨 2 点,我如何在当地时间早上 7 点到晚上 7 点之间找到 GMT 偏移量?
我有带有 GMT 偏移列 (-3600, -14400, 28000 等) 的数据库记录。我希望能够由偏移量大致在当地白天时间范围内的人进行选择。现在,哪些偏移量是在白天?我完全不知道如何处理这个问题。
如果是伦敦的凌晨 2 点,我如何在当地时间早上 7 点到晚上 7 点之间找到 GMT 偏移量?
我有带有 GMT 偏移列 (-3600, -14400, 28000 等) 的数据库记录。我希望能够由偏移量大致在当地白天时间范围内的人进行选择。现在,哪些偏移量是在白天?我完全不知道如何处理这个问题。
这在外观上更容易。如果您有自 UTC 午夜以来经过的时间,以秒为单位,就像这里
$gmtSecondsSinceMidnight = (gmmktime() - gmmktime(0,0,0));
那么时区应该在几秒钟之内,相对于格林威治标准时间60*60*7
。60*60*19
19 点是 24 小时制的晚上 7 点。
$remoteTZStartZ1 = 7*$hour - $gmtSecondsSinceMidnight;
$remoteTZEndZ1 = 19*$hour - $gmtSecondsSinceMidnight;
这足以制定一个查询,如
echo "SELECT name FROM timezones WHERE
(offsetSeconds > $remoteTZStartZ1 AND offsetSeconds < $remoteTZEndZ1);";
但是,如果remoteTZ
变量超出 12h 偏移量,则需要构造两个额外的括号。否则,您可能会尝试选择偏移量大于 12h 或低于 -12h 的时区。要使其“环绕”,请将偏移量复制到 ±24h:
$remoteTZStartZ2 = $remoteTZStartZ1 - 24*$hour;
$remoteTZEndZ2 = $remoteTZEndZ1 - 24*$hour;
$remoteTZStartZ3 = $remoteTZStartZ1 + 24*$hour;
$remoteTZEndZ3 = $remoteTZEndZ1 + 24*$hour;
并使用这样的查询
echo "SELECT name FROM timezones WHERE
(offsetSeconds > $remoteTZStartZ1 AND offsetSeconds < $remoteTZEndZ1) OR
(offsetSeconds > $remoteTZStartZ2 AND offsetSeconds < $remoteTZEndZ2) OR
(offsetSeconds > $remoteTZStartZ3 AND offsetSeconds < $remoteTZEndZ3);";
likeitlikeit 的回答有助于改进我的工作,唯一真正缺少的是锚定在实际时间戳中。我以这种方式粗略地解决了这个问题,尽管这可以大大改善:
date_default_timezone_set('Europe/London');
$currentTimestamp = time();
$startHour = strtotime("7am");
$endHour = $startHour+50400; //9pm
$start = ($startHour>$currentTimestamp) ? ($startHour - $currentTimestamp) : -1 * abs($currentTimestamp - $startHour);
$end = ($endHour>$currentTimestamp) ? ($endHour - $currentTimestamp) : -1 * abs($currentTimestamp - $endHour);
PHP 在 5.2+ 版本中具有此功能DateTimeZone::getOffset