PHP mktime和时区

时间:2016-03-18 23:31:03

标签: php timezone mktime

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

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

  

返回与给定参数对应的Unix时间戳。这个   timestamp是一个长整数,包含之间的秒数   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";

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

1451606400
1451566800

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

1451606400 - 1451566800 = 39600 / (60*60) = 11

我对mktime和/或使用mktime时考虑时区的原因有何不正确理解?

2 个答案:

答案 0 :(得分:7)

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

  

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

还有comment on the PHP documentation for this function解释了mktime()gmmktime()time()的工作原理。从本质上讲,他们假设您总是在时区中思考,即使UNIX时间戳本身没有时区。

答案 1 :(得分:0)

生成的Unix时间戳确实以时区不可知的方式进行编码,但是相对于当前进程设置的时区来解释输入参数。实际上,悉尼2016-01-01 00:00:00(GMT + 11)发生在世界标准时间2016-01-01 00:00:00前11小时。 当某个外国人告诉您时间时,您必须知道其时区才能正确解释它,mktime()也是如此。

如果要传递给mktime()的日期是UTC日期,请使用为此目的而存在的gmmktime()