减法运算的时间正常,但加法没有

时间:2014-12-22 12:01:46

标签: php

// $p_hour_data['p_hour']=02:00:00
// $data['dapr_p_hour']=01:00:00 
// answer is=01:00:00

$total_hour=((strtotime($p_hour_data['p_hour']))-(strtotime($data['dapr_p_hour'])));
echo $total_hour=gmdate("H:i:s", $total_hour);

给定代码用于减去$p_hour_data['p_hour']=02:00:00$data['dapr_p_hour']=01:00:00的值的时间。

结果正确00:01:00

但是当我将其更改为添加时,它会给出错误的答案09:31:44

为什么会出现任何时间添加操作的解决方案?

2 个答案:

答案 0 :(得分:0)

问题是您没有指定时区:例如(使用php -a交互模式):

> echo gmdate("H:i:s",strtotime('01:00:00'));
00:00:00

但是,如果您将"UTC"添加到所有时间戳,则会显示正确的结果。

原因是如果您没有指定时区,PHP将查看服务器设置并假设时间以服务器指定的时区表示。这意味着02:00:00在比利时被解析为01:00:00 UTC。对于减法,这不是问题(除非节省时间也起作用)。然而,对于添加,当一天开始时,需要有一个约定。但是,通过添加UTC,时间就不那么模糊了。

示例(使用php -a):

$ php -a
php > echo gmdate("H:i:s\n",strtotime('02:00:00 UTC')+strtotime('01:00:00 UTC'));
03:00:00
php > echo gmdate("H:i:s\n",strtotime('02:00:00 UTC')-strtotime('01:00:00 UTC'));
01:00:00
php > echo gmdate("H:i:s\n",strtotime('02:00:00')-strtotime('01:00:00'));
01:00:00
php > echo gmdate("H:i:s\n",strtotime('02:00:00')+strtotime('01:00:00'));
01:00:00

答案 1 :(得分:0)

您的问题不是@CommuSoft提及的时区问题。这是一个“整数”溢出值问题。

请记住strtotime返回一个UNIX时间戳值(一个较大的值,但仍然是系统的整数值范围),但是为它添加另一个时间戳值(另一个大值)会导致整数溢出PHP通过将结果转换为float来处理;见here

strtotime('02:00:00'); //int(1419213600)

strtotime('01:00:00'); //int(1419210000)

strtotime('02:00:00') + strtotime('01:00:00'); //float(2838423600)

(int) (strtotime('02:00:00') + strtotime('01:00:00')); //int(-1456543696)

//Values can vary due to different default time zone ;)

一旦结果传递给date函数,它就会转换回integer => -145 .....(某些负值),您的时间戳相当于1923-11-05 21:31:44

希望它可以帮助您找出问题。