题
我在使用 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 开始计算 格林威治标准时间, ,因此您的代码中隐藏了时区转换。你可以
- 使用
gmmktime()
为 GMT 日期创建时间戳, - 使用内置的 日期时间类,
- 纠正 php.ini 中的时区设置, , 或者
- 设置该函数使用的时区
date_default_timezone_set()
.
其他提示
我只是跑从命令行以下,得到了以下的(预期的)输出。如果你运行它们,会发生什么?
$ 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
.
不隶属于 StackOverflow