我有一个网站,可以在其中计算订单的交货日期。所以我们的工作日从1到30开始,所以主要情况是,
下面是我的代码,问题在于它仅在某些日子有效。大多数情况下,这会增加一天的时间。
$thedays = array('1','2','3','4','5');
foreach ($thedays as $days) {
if (date('H') > 17) {
$cutoff = 1;
} else {
$cutoff = 0;
}
$extra_days = 0;
//is today a weekend
if(date('l', strtotime(date('Y-m-d'))) == 'Sunday') {
$extra_days = 1;
}
if(date('l', strtotime(date('Y-m-d'))) == 'Saturday') {
$extra_days = 2;
}
$total1= $cutoff+$extra_days+$days;
$date_1 = date('Y-m-d', strtotime("+".$total1." day"));
$date = date('Y-m-d');
$date2 = $date_1;
$period = new DatePeriod(
new DateTime($date),
new DateInterval('P1D'),
new DateTime($date2)
);
$q = 0;
$d= 0;
foreach ($period as $key => $value) {
$d++;
if ($value->format('N') > 5) {
$q++;
}
}
$total_days_with_weekends = ($days+$q+$extra_days);
$date_1 = date('Y-m-d', strtotime("+".$total_days_with_weekends." day"));
if(date('l', strtotime($date_1)) == 'Saturday') {
$date_1 = date('Y-m-d', strtotime("-1 day"));
}
if(date('l', strtotime($date_1)) == 'Sunday') {
$days= $days+1;
$date_1 = date('Y-m-d', strtotime("+".$days." day"));
}
echo $data_1;
}
有人可以建议这样做的最佳方法吗?
谢谢
答案 0 :(得分:0)
考虑周六也是无效的交货日期,我得到了如下信息:
> let format = "%0.4ef";;
val format : string = "%0.4ef"
> withFormat format 123.4567899112233445566;;
val it : string = "1.2346e+002f"
可以用工作日简化:
function getDeliveryDate(DateTime $orderDate, int $days): DateTime {
$deliveryDate = clone $orderDate;
$remainingDays = $days;
// if it is after 18:00 we skip current day
if ($orderDate->format('H') >= 18) {
$deliveryDate->add(new DateInterval('P1D'));
}
// we process days until we reach specified amount
while ($remainingDays > 0) {
$deliveryDate->add(new DateInterval('P1D'));
// we skip saturday and sunday
if (!in_array($deliveryDate->format('D'), ['Sat', 'Sun'])) {
$remainingDays--;
}
}
return $deliveryDate;
}
测试:
function getDeliveryDate(DateTime $orderDate, int $days): DateTime {
$deliveryDate = clone $orderDate;
if ($orderDate->format('H') >= 18) {
$days++;
}
return $deliveryDate->modify('+'.$days.' weekday');
}
测试输出:
function check(string $orderDate, int $days, string $expectedDeliveryDate) {
$deliveryDate = getDeliveryDate(new DateTime($orderDate), $days);
if ($deliveryDate->format('Y-m-d') !== $expectedDeliveryDate) {
echo 'Order date: '.$orderDate.', days: '.$days.', expected: '.$expectedDeliveryDate.' got: '.$deliveryDate->format('Y-m-d').PHP_EOL;
} else {
echo 'Order date: '.$orderDate.', days: '.$days.', expected: '.$expectedDeliveryDate.' - OK'.PHP_EOL;
}
}
check('2020-07-08 12:00', 1, '2020-07-09');
check('2020-07-08 12:00', 2, '2020-07-10');
check('2020-07-08 18:00', 1, '2020-07-10');
check('2020-07-08 12:00', 6, '2020-07-16');
check('2020-07-08 12:00', 5, '2020-07-15');