我在使用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的问题,但这不会解释其他日期关闭。
有什么想法吗?
答案 0 :(得分:5)
您的服务器的时区与您预期的时区不同。自1.1.1970 00:00:00 GMT 以来,Unix时间戳以秒为单位进行测量,因此您的代码中有一个隐藏的时区转换。你可以
gmmktime()
为GMT日期创建时间戳,date_default_timezone_set()
设置时区。答案 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;
我使用了soulmerge的一种可能性:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
但应始终设置时区(使用date_default_timezone_set()
或直接使用DateTime
。