Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP夏令时检测_Php_Dst_Gmt_Binary Search Tree - Fatal编程技术网

PHP夏令时检测

PHP夏令时检测,php,dst,gmt,binary-search-tree,Php,Dst,Gmt,Binary Search Tree,我需要在当地时间上午9:00向世界各地的用户发送电子邮件。服务器在英国。我所能做的就是在每个用户和服务器的时间之间设置一个时差,如果DST不存在,这个时差就可以完美地工作 下面是一个例子来说明这一点: 约翰在纽约工作,离服务器(英国)时间5小时 Richard在英国伦敦工作,与服务器相差0小时 当服务器在某个星期天的凌晨2:00从GMT转到GMT+1(BST)时,这意味着John现在有-6小时的时差 这种情况我仍然可以通过更新服务器本地时间以外的所有用户来处理,但一旦我向前/向后移动了所有其

我需要在当地时间上午9:00向世界各地的用户发送电子邮件。服务器在英国。我所能做的就是在每个用户和服务器的时间之间设置一个时差,如果DST不存在,这个时差就可以完美地工作

下面是一个例子来说明这一点:

  • 约翰在纽约工作,离服务器(英国)时间5小时
  • Richard在英国伦敦工作,与服务器相差0小时
当服务器在某个星期天的凌晨2:00从GMT转到GMT+1(BST)时,这意味着John现在有-6小时的时差

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

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

稍微更改一下我的答案:看起来它可以满足您的需要,前提是您的PHP>=5.2

根据文档中的注释:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

您需要自己了解DST转换的所有细节吗?或者你只需要知道在给定的时区上午9点是什么时候

如果是后者,PHP可以使用操作系统的时区数据库为您完成这项工作。该函数非常擅长“理解”您的意思:

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

正如Jimmy指出的,您可以使用时区转换,但这在PHP=5.2.2上不可用,但带参数的getTransitions()不可用!在这种情况下,这里有一个函数可以为您提供时区数据,包括是否在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

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

Hi Jimmy,请您在答复中更加精确,而不仅仅是给我一个PHP函数。在如何解决这个问题上,它并没有真正帮助我。干杯,尼古拉斯。@Nicolas-你需要在数组中找到时区,然后检查该时区的dst字段。@Nicolas我用一种更简单的方法修改了我的答案,并提供了一个关于如何处理的注释。希望它能有所帮助。@JimmySawczuk-请看我下面关于PHP上的这个解决方案的答案,它的效果非常好。。!!thanx buddy。。!!因为我已经在代码中的几个地方使用了strotime,所以我认为您的答案是最好的,即使我还有很多工作要做,特别是将它集成到我的crontab作业中(我将使用
TZ=
标记)。干杯如果指定的时间是DST,这将不起作用,尤其是当时间变为-1时。@Gorillape你确定吗?无论提到的日期是否在DST上,它都应该通过正确地为该城市进行转换来工作。但是,请注意,当您随后将date()与该时间戳一起使用时,它将使用带有date\u default\u timezone\u set()的默认时区集!对我来说,忽略夏季时间:默认时区欧洲/巴黎,如果(date('I')==1){date_default_timezone_set('european/London');}因为我希望总是UTC+1@khaled_webdev:然后使用“
+01:00
”时区。
日期(“I”)
帮助我回答了一个相关问题。使用布尔值很方便