PHP产品预约数据处理:最近预约日期查找及预约数量指定日期后归零的实现问题
解决产品预约日期判断及数量状态逻辑问题
嘿,我看你在处理ID3139产品的预约库存逻辑时卡壳了——既要找到最近的预约日期,又要准确判断3件产品在2040-06-13前后的预约状态。我来帮你把这两个问题理顺,先从你现有的脚本问题说起,再补全状态判断的逻辑。
一、修正“查找最近预约日期”的脚本
你的原函数里计算日期间隔的方式有问题:abs(strtotime($date) > strtotime($day))得到的是布尔值转成的0或1,没法真实反映两个日期之间的时间差。而且没有过滤掉当前日期之前的过期预约,可能会返回已经失效的日期。
这里给你调整后的函数,它会只考虑当前日期及之后的预约日期,然后找到距离最近的那一个:
function find_closest_appointment_date($appointment_dates, $current_date) { $closest_date = null; $min_interval = PHP_INT_MAX; $current_timestamp = strtotime($current_date); foreach($appointment_dates as $date) { $date_timestamp = strtotime($date); // 跳过当前日期之前的过期预约(如果需要包含当天,改成>=即可) if ($date_timestamp < $current_timestamp) { continue; } // 计算时间戳差值,得到真实的日期间隔 $interval = abs($current_timestamp - $date_timestamp); if ($interval < $min_interval) { $min_interval = $interval; $closest_date = $date; } } return $closest_date; }
二、实现“预约数量随截止日期切换”的逻辑
针对你提到的“3件产品在2040-06-13前保持预约状态,之后数量归零”的需求,我们可以写一个单独的函数来处理日期判断和数量返回,这样后续如果截止日期或预约数量有变动,直接修改参数即可:
function get_appointment_quantity($target_date, $appointment_end_date = '2040-06-13', $reserved_quantity = 3) { $target_timestamp = strtotime($target_date); $end_timestamp = strtotime($appointment_end_date); // 目标日期在截止日期之前(包含当天)返回预约数量,之后返回0 if ($target_timestamp <= $end_timestamp) { return $reserved_quantity; } else { return 0; } }
三、结合使用示例
把两个函数结合起来,就能完整实现你的需求了。这里给你一个使用示例(假设你已经从数据库拿到了ID3139的所有预约日期数组):
// 模拟从数据库获取的ID3139预约日期数组 $appointment_dates = ['2021-12-29', '2022-01-05', '2040-06-13']; $current_date = date('Y-m-d'); // 获取当前系统日期 // 查找最近的有效预约日期 $closest_date = find_closest_appointment_date($appointment_dates, $current_date); echo "最近的预约日期:" . $closest_date . "\n"; // 获取当前日期的预约数量 $current_quantity = get_appointment_quantity($current_date); echo "当前预约数量:" . $current_quantity . "\n"; // 测试2040-06-14的预约数量(应该返回0) $future_quantity = get_appointment_quantity('2040-06-14'); echo "2040-06-14的预约数量:" . $future_quantity . "\n";
这样运行后,就能准确得到你需要的最近预约日期,以及任意日期对应的预约数量状态了。
内容的提问来源于stack exchange,提问作者Blaaszka
相关产品推荐
相关产品推荐

