PHP mktime和时区

Luk*_*uke 4 php timezone mktime

我正在研究一些与时间相关的功能,我选择始终使用UTC时间并将时间戳存储为整数以保持一致性.

但是,我注意到当我使用mktime它时,似乎当前设置的时区会影响返回值mktime.从我理解的文档中,mktime应该返回自epoch以来的秒数:

返回与给定参数对应的Unix时间戳.此时间戳是一个长整数,包含Unix Epoch(1970年1月1日00:00:00 GMT)与指定时间之间的秒数.

http://php.net/manual/en/function.mktime.php

但是,似乎mktime包括当前设置的时区.使用以下代码时:

date_default_timezone_set('UTC');
$time = mktime(0, 0, 0, 1, 1, 2016 );
echo "{$time}\n";

date_default_timezone_set('Australia/Sydney');
$time = mktime(0, 0, 0, 1, 1, 2016 );
echo "{$time}\n";
Run Code Online (Sandbox Code Playgroud)

我希望这两个时间值相同,但显然它们不是:

1451606400
1451566800
Run Code Online (Sandbox Code Playgroud)

这似乎是一个11小时的差异:

1451606400 - 1451566800 = 39600 / (60*60) = 11
Run Code Online (Sandbox Code Playgroud)

我在使用时没有正确理解mktime和/或为什么要考虑时区mktime

jsf*_*fan 8

我不能告诉你为什么它是这样的(PHP在日期和时间方面对我来说从来没有意义)但是有一个替代功能gmmktime(),它是

与mktime()相同,但传递的参数表示GMT日期.gmmktime()在内部使用mktime(),因此只能使用在派生本地时间内有效的时间.

也有此功能的PHP文件上的评论,说明如何mktime(),gmmktime()time()工作.从本质上讲,他们认为即使UNIX时间戳本身没有时区,您也总是在时区中思考.