1

我在使用 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 的问题,但这并不能解释其他日期的关闭。

有任何想法吗?

4

3 回答 3

5

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

于 2009-07-13T18:04:43.547 回答
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
于 2009-07-13T18:06:38.303 回答
0

我的问题是,在我输入带有前导零mktime的日期和月份。比函数返回了错误的结果。一种选择是使用以下函数删除前导零

$str = ltrim($str, '0');

资料来源:如何删除字符串中的所有前导零

或者

$var = (int)$var;

资料来源:PHP 删除第一个零

我使用了灵魂融合的一种可能性:

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

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

于 2013-08-07T11:15:19.917 回答