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

有任何想法吗?

有帮助吗?

解决方案

您的服务器的时区与您预期的时区不同。Unix 时间戳以秒为单位,从 1.1.1970 00:00:00 开始计算 格林威治标准时间, ,因此您的代码中隐藏了时区转换。你可以

其他提示

我只是跑从命令行以下,得到了以下的(预期的)输出。如果你运行它们,会发生什么?

$ 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

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

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

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

或者

$var = (int)$var;

来源: PHP 删除第一个零

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top