// $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
。
为什么会出现任何时间添加操作的解决方案?
答案 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
。
希望它可以帮助您找出问题。