MKTime函数返回错误的时间?

时间:2009-07-13 18:01:00

标签: php datetime mktime

我在使用mktime功能时遇到了一些麻烦。在我的生产服务器上,如果我执行以下操作:

echo '<p>' . mktime(24, 0,0, 8,29,2009) . ' - 12pm</p>';
echo '<p>' . mktime(23, 0,0, 8,29,2009) . ' - 11pm</p>';
echo '<p>' . mktime(22, 0,0, 8,29,2009) . ' - 10pm</p>';

然后将这些时间戳转换回可读格式(使用www.unixtimestamp.com进行快速转换),时间全部关闭一小时。我最初认为这是2400 VS 0000的问题,但这不会解释其他日期关闭。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您的服务器的时区与您预期的时区不同。自1.1.1970 00:00:00 GMT 以来,Unix时间戳以秒为单位进行测量,因此您的代码中有一个隐藏的时区转换。你可以

答案 1 :(得分:0)

我刚从命令行运行以下命令并得到以下(预期)输出。如果你运行会发生什么?

$ php -r "echo date('H:i:s Y-m-d', mktime(24, 0, 0, 8, 29, 2009));"
00:00:00 2009-08-30

$ php -r "echo date('H:i:s Y-m-d', mktime(23, 0, 0, 8, 29, 2009));"
23:00:00 2009-08-29

$ php -r "echo date('H:i:s Y-m-d', mktime(22, 0, 0, 8, 29, 2009));"
22:00:00 2009-08-29

答案 2 :(得分:0)

我的问题是在mktime我用前导零输入日期和月份。比功能还给我错误的结果。一种选择是使用类似

的函数删除前导零
$str = ltrim($str, '0');

来源:How to remove all leading zeroes in a string

$var = (int)$var;

来源:PHP remove first zeros

我使用了soulmerge的一种可能性:

$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();

但应始终设置时区(使用date_default_timezone_set()或直接使用DateTime