strtotime引起负数的一个问题
在一个开源的crm中看到如下代码
$update_time = $param['update_time'];
if (strtotime($param['update_time'])) {
$update_time = strtotime($param['update_time']);
}
if (!$is_lock && $deal_status !== '已成交') {
$follow_time = time() - $param['follow_day'] * 86400;
$deal_time = time() - $param['deal_day'] * 86400;
if (($update_time < $follow_time) || ($param['deal_time'] < $deal_time)) {
$isPool = 1; //是公海
} else {
$sub_follow_day = ceil(($update_time - $follow_time) / 86400);
$sub_deal_day = ceil(($param['deal_time'] - $deal_time) / 86400);
$poolDay = ($sub_deal_day > $sub_follow_day) ? $sub_follow_day : $sub_deal_day;
$poolDay = $poolDay ?: 0;
if ($poolDay < 0) {
$isPool = 1; //是公海
}
}
其中$update_time是个时间戳,但是为什么要用if (strtotime($param[‘update_time’]))这玩意儿判断暂且不说(我也看不懂为什么这样,但是这玩意儿正常运行)但是到 2020/9/18 14:24:44这个时候 此时的时间戳为1600410284 导致strtotime(1600410284) 为-53182281559,导致$update_time < $follow_time 此时逻辑就暴雷了。。
总结下问题:
strtotime(1600413015) 值为32999644841
strtotime(1600410284) 值为-53182281559
那么问题来了 为什么一个值为正数 一个值为负数。括号里面的值为时间戳
期待大家的答案
结论:使用 if (strtotime($param['update_time'])) 这个bug不得不修。
命令行里实际跑一下就有了。 首先获取一个月前的时间戳:
现在格式化作者贴出的两个时间戳,我们将其格式化,看看strtotime到底把这个时间戳识别成什么了。
很容易联想到了是吧。自动数据类型转换:unixstamp 转换为string类型传给 strtotime 函数, strtotime函数自动推断传入参数的日期时间格式,解析成了 “HisY” 这样的格式。
所以,bug需要修,判断时间戳的方法需要改进。 自行搜索可解决。