
本文介绍如何在 php 中准确计算订单发货日期,需综合考虑用户下单时间(含截止时间规则)、非发货日(如周末/自定义停运日)及法定节假日,并提供可直接集成的健壮实现方案。
本文介绍如何在 php 中准确计算订单发货日期,需综合考虑用户下单时间(含截止时间规则)、非发货日(如周末/自定义停运日)及法定节假日,并提供可直接集成的健壮实现方案。
在电商或订单系统中,仅简单加 1 天无法真实反映发货逻辑:若用户在下午 2 点下单(晚于上午 11 点截止时间),当日已无法交货;若计算出的发货日恰逢节假日或商家设定的非运营日(如每周二、四不发货),还需自动顺延。以下是一个生产就绪的 PHP 发货日期计算方案,兼顾时间判断、节假日跳过与可配置停运日。
✅ 核心逻辑说明
-
截止时间判断:将用户提交的
orderTime(格式建议为H:i:s)与$cutOffTime比较;若 ≥ 截止时间,则发货日从次日起算; -
基础发货日偏移:根据库存状态(
$outOfStock)动态调整初始偏移量(如缺货+2天,有货+1天); -
节假日 & 自定义停运日过滤:使用
while循环持续递增日期,直至找到一个既非节假日、也非停运日、且为工作日的日期; -
工作日约束(增强版):默认仅排除周六(6)、周日(0),也可扩展为支持自定义停运星期几(如
'excludeWeekdays' => [2,4]表示周二、周四不发货)。
? 完整可运行函数(functions.php)
function getShippingDate($orderDate, $orderTime) {
// 配置项(可根据业务灵活修改)
$cutOffTime = '11:00:00'; // 下单截止时间(24小时制)
$outOfStock = true; // 库存状态:true=缺货(+2天),false=有货(+1天)
$excludeWeekdays = [0, 6]; // 停运星期几:0=周日,6=周六(PHP date('w'))
$holidays = ['10-08-2022', '13-08-2022']; // 法定/自定义节假日(d-m-Y 格式)
// 步骤1:解析并标准化订单日期时间
$orderDateTime = DateTime::createFromFormat('d-m-Y H:i:s', "$orderDate $orderTime");
if (!$orderDateTime) {
throw new InvalidArgumentException("Invalid order date/time format");
}
// 步骤2:确定基础发货日(考虑截止时间)
$baseOffset = $outOfStock ? 2 : 1;
$shippingDate = clone $orderDateTime;
// 若下单时间 >= 截止时间,则发货日从次日开始计算
if ($orderTime >= $cutOffTime) {
$baseOffset++;
}
$shippingDate->modify("+{$baseOffset} days");
// 步骤3:循环跳过节假日 & 停运日 & 周末(增强鲁棒性)
while (true) {
$dateStr = $shippingDate->format('d-m-Y');
$weekday = (int)$shippingDate->format('w');
// 条件1:是否为停运星期几?
if (in_array($weekday, $excludeWeekdays)) {
$shippingDate->modify('+1 day');
continue;
}
// 条件2:是否为节假日?
if (in_array($dateStr, $holidays)) {
$shippingDate->modify('+1 day');
continue;
}
// 所有条件满足 → 返回结果
return $shippingDate->format('Y-m-d'); // 强烈建议统一返回 Y-m-d 格式(ISO 8601)
}
}
// 处理 AJAX 请求(兼容原代码)
if (isset($_POST['call']) && !empty($_POST['date']) && !empty($_POST['time'])) {
header('Content-Type: application/json');
try {
$result = getShippingDate($_POST['date'], $_POST['time']);
echo json_encode(['success' => true, 'shipping_date' => $result]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
}
⚠️ 注意事项与最佳实践
-
前端传参规范:确保
$_POST['date']为d-m-Y(如15-08-2022),$_POST['time']为H:i:s(如14:30:00)。若前端 DatePicker 输出格式不同(如Y-m-d),请在 JS 或 PHP 层统一转换; -
时区安全:务必在脚本开头设置时区(如
date_default_timezone_set('Asia/Shanghai');),避免跨时区偏差; - 性能优化:节假日数组建议从数据库或缓存(Redis)加载,避免硬编码;高频调用场景可预生成未来 90 天有效发货日缓存;
-
AJAX 响应处理(JS 端补充):
success: function(response) { const data = JSON.parse(response); if (data.success) { alert('预计发货日期:' + data.shipping_date); } else { alert('计算失败:' + data.error); } }
该方案将时间敏感逻辑、业务规则与日期运算解耦,具备高可读性、可维护性与扩展性,可直接嵌入现有订单系统中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











