“格林威治标准时间0:00”的PHP strtotime时区问题

时间:2015-05-25 01:08:15

标签: php timezone strtotime

所以我有一个函数get_start_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

BUT:

$x = 1432432800;
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 02:00:00
2015-May-23 00:00:00

因此,对于$ x的某个值,输出错误地跳到前一天并输出。一些进一步的实验表明跳转发生的$ x值是凌晨4点,即时间戳1432440000给出了正确的结果,但时间戳1432439999没有。

现在,根据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。

1 个答案:

答案 0 :(得分:0)

使用strtotime('today', $time)。您需要使用date_default_timezone_setdate.timezone INI设置来选择您的时区。