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
那么问题来了 为什么一个值为正数 一个值为负数。括号里面的值为时间戳
期待大家的答案

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

结论:使用 if (strtotime($param['update_time'])) 这个bug不得不修。

命令行里实际跑一下就有了。 首先获取一个月前的时间戳:

$last_month = strtotime('last month'); // 1597878629
var_dump(strtotime($last_month)); // bool(false)

现在格式化作者贴出的两个时间戳,我们将其格式化,看看strtotime到底把这个时间戳识别成什么了。

echo date('Y-m-d H:i:s', strtotime(1600413015)); // 3015-09-20 16:00:41
echo date('Y-m-d H:i:s', strtotime(1600410284)); // 0284-09-20 16:00:41

很容易联想到了是吧。自动数据类型转换:unixstamp 转换为string类型传给 strtotime 函数, strtotime函数自动推断传入参数的日期时间格式,解析成了 “HisY” 这样的格式。

所以,bug需要修,判断时间戳的方法需要改进。 自行搜索可解决。

4年前 评论
讨论数量: 4

@Liuzhipeng_laravel 邀请大神

4年前 评论
Liuzhipeng_laravel 4年前

www.php.net/manual/zh/function.str...

看了文档就能明白 if (strtotime ($param [‘update_time’])) 这里是判断这个 update_time 是不是一个正常的时间,如果是,就把这个时间转为时间戳赋值给 $update_time ,这里作者的目的可能就是 $param [‘update_time’] 可能有为空的情况存在,这样写不一定是合理的,但是加入社区都三年了,不太应该连这种常用函数的参数该传什么都整不明白,还没有看文档的习惯吧:stuck_out_tongue_closed_eyes:

4年前 评论
❤seven (楼主) 4年前

不要什么东西都往strtotime里头传,这个坏习惯得改。。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!