1

如果是伦敦的凌晨 2 点,我如何在当地时间早上 7 点到晚上 7 点之间找到 GMT 偏移量?

我有带有 GMT 偏移列 (-3600, -14400, 28000 等) 的数据库记录。我希望能够由偏移量大致在当地白天时间范围内的人进行选择。现在,哪些偏移量是在白天?我完全不知道如何处理这个问题。

4

3 回答 3

1

这在外观上更容易。如果您有自 UTC 午夜以来经过的时间,以秒为单位,就像这里

$gmtSecondsSinceMidnight = (gmmktime() - gmmktime(0,0,0));

那么时区应该在几秒钟之内,相对于格林威治标准时间60*60*760*60*1919 点是 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);";
于 2013-05-19T19:04:13.387 回答
1

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);
于 2013-05-20T16:18:56.643 回答
0

PHP 在 5.2+ 版本中具有此功能DateTimeZone::getOffset

于 2013-05-19T18:23:22.920 回答