PHP - mktime()函数返回错误的时间

时间:2016-09-13 06:27:50

标签: php

有问题的代码

我正在尝试使用从文件中提取的一些字符串值来构建时间。 这基本上就是运行的代码。

$hour = "18";            
$minutes = "0";
$month = "28";
$day = "4";
$year = "2016";
echo("<div>"."Current PHP version: " . phpversion()."</div>");  
echo("<div>hour :: ".(int)$hour."</div>");  
echo("<div>minutes :: ".(int)$minutes."</div>");        
echo("<div>month :: ".(int)$month."</div>");        
echo("<div>day :: ".(int)$day."</div>");        
echo("<div>year :: ".(int)$year."</div>");                  
$built_time = mktime((int)$hour,(int)$minutes,0,(int)$month,(int)$day,(int)$year);
echo("<div>  Built Time [Y-m-d H:i:s]: ".date( 'Y-m-d H:i:s',$built_time)."</div>");

错误的结果

输出的接收是:

Output for given code snippet

多次尝试产生了以下结果

Other attempts

正如您所看到的,它确实提供了正确的结果!为什么会这样呢?它不是一个时区问题,因为它的发布日期是未来几年。

根据mktime() documentation,参数序列也是正确的。不知道为什么这个电话会失败。

4 个答案:

答案 0 :(得分:3)

根据您的输入,结果是正确的

mktime加密month值介于1-12之间。在除上一个月之外的每次尝试中,值均为28,28,21,21.

因此,当月份的值大于12时,它会引用下一年的适当月份。因此,在前两个案例中,它将是04,而在第3和第4个案例中,它将是09

  

当您将月份值大于12时,它会计算当月之后的N个月。所以在前两个案例中它 2018年4月(04)以及第三和第四个九月(09)2017

因此根据您的输入输出是正确的。

答案 1 :(得分:2)

这绝对是正确的输出。 2016年第28个月是2018年4月

答案 2 :(得分:1)

这可能只是一个简单的错误,但一年内没有28个月,所以我猜月和日交换了。

$hour = "18";            
$minutes = "0";
$month = "4";
$day = "28";
$year = "2016";
$built_time = mktime((int)$hour,(int)$minutes,0,(int)$month,(int)$day,(int)$year);

echo"
<div>"."Current PHP version: " . phpversion()."</div>
<div>hour :: {$hour}</div>
<div>minutes :: {$minutes}</div>
<div>month :: {$month}</div>
<div>day :: {$day}</div>
<div>year :: {$year}</div>
<div>  Built Time [Y-m-d H:i:s]: ".date( 'Y-m-d H:i:s',$built_time)."</div>";
/*
outputs

Current PHP version: 5.3.2
hour :: 18
minutes :: 0
month :: 4
day :: 28
year :: 2016
Built Time [Y-m-d H:i:s]: 2016-04-28 18:00:00

*/

答案 3 :(得分:1)

试试这个

$built_time=strtotime($year."-".$month."-".$day." ".$hour.":".$minutes.":00");
   echo("<div>  Built Time [Y-m-d H:i:s]: ".date( 'Y-m-d H:i:s',$built_time)."</div>");