php strtotime +2.5小时的bug?

时间:2014-04-02 07:21:44

标签: php strtotime

strtotime有一些意想不到的行为:

$d = '2.5';                                   // i.e. hours
$t = '2014-03-20 08:30:00';                   // mysql datetime
$ut = strtotime($t);                          // value: 1395297000
$s = $d * 60 * 60;                            // duration in seconds: 9000
$plusHrs = strtotime($t.' +'.$d.' hours');    // value: 1395315000
$plusSec = strtotime($t.' +'.$s.' seconds');  // value: 1395306000

预期的行为是$ plusHrs = $ plusSec。无论输入日期是什么,都会发生这种情况,这意味着它不是夏令时问题。

这是一个错误吗? (PHP v5.3.14)

3 个答案:

答案 0 :(得分:4)

不,这不是一个错误。 strtotime()期望relative格式的整数值。因此,您的+2.5小时将被视为"+2 GMT" ,然后 "+5"小时,点数将被忽略。您可以将其更改为逗号或甚至删除 - 结果不会更改,因为再次只解析整数。因此,这种陈述将被视为相对于GMT抵消的相对小时数增加:

//this is the same things:
//and they mean set timesone to GMT+2 & add 5 hours:
date('Y-m-d H:i:s', strtotime('now +2.5 hours'));
date('Y-m-d H:i:s', strtotime('now +2,5 hours'));
date('Y-m-d H:i:s', strtotime('now +2 5 hours'));

因此,例如,+1.5 hours将执行add 5 hours for time in GMT +1。这意味着,最终结果将取决于当前时区的,因为初始时间戳将设置为当前时区(在上面的示例中为now)。

答案 1 :(得分:0)

$plusHrs = strtotime($t.' +'.$d.' hours');    
$plusSec = strtotime($t.' +'.$s.' seconds'); 

These two are different, $s = $d * 60 * 60 while $d = '2.5.

答案 2 :(得分:0)

你可以试试这几个小时2.5

$plusHrs = strtotime($t.' + 2 hours 30 minutes');