PHP strotime时区问题与';格林尼治标准时间0:00';

PHP strotime时区问题与';格林尼治标准时间0:00';,php,timezone,strtotime,Php,Timezone,Strtotime,所以我有一个函数get\u start\u of_day($time),我想给我一个时间戳,表示一天中的第一分钟,时间戳$time 最初,我使用的是: function get_start_of_day($time) { return strtotime('0:00 GMT', $time); } 看起来效果不错 然后我意识到,在某些时候,它是返回前一天的午夜,例如: $x = 1432468800; echo gmdate('Y-M-d H:i:s', $x); $y = ge

所以我有一个函数
get\u start\u of_day($time)
,我想给我一个时间戳,表示一天中的第一分钟,时间戳
$time

最初,我使用的是:

 function get_start_of_day($time) {
     return strtotime('0:00 GMT', $time);
 }
看起来效果不错

然后我意识到,在某些时候,它是返回前一天的午夜,例如:

$x = 1432468800;
echo gmdate('Y-M-d H:i:s', $x);
$y = get_start_of_day($x);
echo gmdate('Y-M-d H:i:s', $y);
产出:

2015-May-24 12:00:00
2015-May-24 00:00:00
2015-May-24 02:00:00
2015-May-23 00:00:00
但是:

产出:

2015-May-24 12:00:00
2015-May-24 00:00:00
2015-May-24 02:00:00
2015-May-23 00:00:00
因此,在某个$x的值下,输出错误地跳到前一天并输出该值。一些进一步的实验表明,跳转发生时$x的值为4am,即时间戳
1432440000
给出了正确的结果,但时间戳
143243999
没有给出正确的结果

现在,根据Epoch Converter,我在GMT-4:00。似乎这一定是原因。我已将函数更新为:

 function get_start_of_day($time) {
     $start_of_day = strtotime('tomorrow 0:00 GMT', $time);
     if ($start_of_day > $time) {
         $start_of_day -= 86400;
     }
     return $start_of_day;
 }
这似乎很好,但我忍不住想知道…这是怎么回事?有人知道吗

提前感谢!:)


编辑:我正在使用GMT,以防我移动到一个新的服务器…我不希望在我假设移动后得到不同的开始日期值,这可能不会与旧值同步。所以我想,只要一直使用GMT就可以了。

使用
strotime('today',$time)
。您需要使用或INI设置来选择您的时区。

可能您的系统时区不是GMT。因此,如果您正在检查的时间在+/-您的时区偏移内,您将得到您不期望的值……那么您现在使用的功能是这样的吗?如果是这样的话,你能再清楚一点(“最初我使用的是“=>”我的当前函数,但函数坏了”)并将最后一位格式化为实际代码吗?如果我使用
'today'
,那么我会得到特定时区的时间戳。这难道不意味着如果我在不同的时区使用不同的服务器,我的一天开始时间戳将不同步吗?这就是为什么我认为最好使用GMT处理所有事情。使用UTC(而不是GMT)处理所有事情非常好。有关
date\u default\u timezone\u set('UTC')的
date\u default\u timezone\u set('UTC')
,请参见上文!date.timezone没有(在Drupal中,使用my settings.php文件中的
ini_set('date.timezone','UTC')
)。