我正在处理一些与时间相关的功能,我选择始终使用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
时考虑时区的原因有何不正确理解?
答案 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()。