PHP 夏令时检测

2022-08-30 13:55:20

我需要在当地时间上午9:00向世界任何地方的用户发送电子邮件。服务器位于英国。我能做的是在每个用户和服务器的时间之间设置一个时间差,如果DST不存在,这将完全有效。

下面是一个示例来说明它:

  • John 在纽约工作,距离服务器(英国)时间 -5 小时
  • 理查德在英国伦敦工作,所以与服务器相差0小时。

当服务器在某个星期日的凌晨 2:00 从 GMT 转到 GMT +1 (BST) 时,这意味着 John 现在有 -6H 的时差。

此方案我仍然可以通过更新服务器本地时间之外的所有用户来处理,但是一旦我向前/向后移动所有其他用户的时间,我仍然需要一种方法来检测居住在英国境外的用户何时(时间和日期)将(或不会)将其本地时间更改为可能的DST时间。

我需要一个PHP方法来知道/检测世界其他地区何时进入/退出DST。


答案 1

正如Jimmy所指出的,你可以使用时区转换,但这在PHP <5.3上不可用。因为 dateTimeZone() 是 PHP>=5.2.2 但 getTransitions() with arguments 不是!在这种情况下,这里有一个函数可以为您提供时区数据,包括是否在DST中。

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

话虽如此,如果您只需要知道时区是否在DST中,则使用date()有一种更简单的方法。例如,如果您想知道英国是否在DST中,则可以执行以下操作:

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

...或者,如果要指定当前服务器时间以外的日期时间,请提供时间戳作为 date() 的第二个参数。


答案 2

您是否需要自己了解DST转换的所有详细信息?或者您只需要知道给定时区的上午9:00?

如果是后者,PHP可以使用操作系统的时区数据库为您执行此操作。strtotime() 函数非常善于“弄清楚”你的意思:

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

只要确保您使用的是PHP支持的时区之一。


推荐