PHP подсчитывает дни до указанного дня ПЛЮС добавляет дни до указанного дня недели - PullRequest
0 голосов
/ 30 апреля 2018

У меня вопрос по поводу функции подсчета PHP. Вот что я пытаюсь сделать.

У меня есть поле под названием «Дата отъезда», а другое - «Срок оплаты». Я хочу отсчитать день от текущей даты до даты отъезда и записать это в «Срок оплаты».

Это просто. Тем не менее, я также условие, что платежи производятся в среду.

Это означает, что если бы дата отправления была в воскресенье, сумма была бы: Считайте сегодня () -> время до даты отправления + дни до среды = количество дней до платежа.

Пожалуйста, помогите мне, если можете!

Заранее спасибо.

UPDATE

вот мой блок кода:

<?php 
while($row4 = mysqli_fetch_array($search_res)){  //shows result of qry

$datetimeFromMysql = $row4['arrival_date'];
$newTime = strtotime($datetimeFromMysql);
$myFormatForView = date("d/m/Y", $newTime);

$datetimeFromMysql2 = $row4['departure_date'];
$newTime2 = strtotime($datetimeFromMysql2);
$myFormatForView2 = date("d/m/Y", $newTime2); 

// отображает эту дату прибытия / отъезда в английском формате даты

$DepartureDate = $row4['departure_date'];
$today = new DateTime();
$depd = new DateTime($DepartureDate);

$interval = $today->diff($depd);
$days = (int)$interval->format('%a');


// adjust to make payment due on a Wednesday
$dow = (int)$depd->format('N');
$days += ($dayOF - $dow) %7;
?>

// $ dayOF позволяет пользователям изменять, когда они обычно делают платежи Mond (1) - Sun / (7)

    <tr>
        <td><?php echo $row4['reference_no'];?></td>
        <td><?php echo $myFormatForView?></td>
        <td><?php echo $myFormatForView2?></td>
        <?php
            echo "<form method='post' action='hostPayments.php?id=" . $row4['group_id'] ."'>" 
        ?>
        <?php if ($days == '0'){ $class="bg-warning"; } else if($depd >= $today){ $class="bg-success"; } else{ $class="bg-danger"; } ?>

        <td class="<?php echo $class; ?>"><b><?php if($days == '0'){?> TODAY! <?php } else {  echo $days; ?></b> Days <?php if($depd >= $today){ ?> Time <?php } else { ?> Ago <?php }} ?></td>     
        <td><?php echo $row4['status']; ?></td>
        <td class="danger"><button type="submit" name="host_payment" class="btn btn-warning"><span class="glyphicon glyphicon-search"></span></button> <b> - NOT COMPLETE</b> <span style="color: white" class="glyphicon glyphicon-exclamation-sign"></span></form></td>


    </tr>
<?php
}

если платеж должен быть в будущем, поле зеленого цвета (bg-success) и выводится $ days + слово «Time» для чтения чего-то вроде (7 дней)

если платеж задерживается, поле красного цвета (bg-danger) и выводится $ days + слово «Ago» для чтения (3 дня назад)

, если платеж должен быть выполнен сегодня, поле имеет желтый цвет (bg-warning) и отображается надпись «TODAY»

  • В записи с датой отъезда 9 мая выводится «6 дней» (я изменил платеж, обычно делаемый сейчас, на вторник). Система рассчитывает на следующий вторник до даты отъезда, а не на следующий вторник.

1 Ответ

0 голосов
/ 30 апреля 2018

Это должно делать то, что вы хотите. Сначала он определяет дату платежа на основе даты отправления и дня недели, когда платежи должны быть выполнены. Затем он вычисляет количество дней до платежа (или сколько оно просрочено). Примечание. Я включил несколько отладочных отпечатков, которые вы, вероятно, захотите удалить.

function payment_due_date($DepartureDate, $dayOf) {
    $depd = new DateTime($DepartureDate);
    // adjust to make payment due on the specified day of the week
    // 1=Monday, 2=Tuesday,...,7=Sunday
    $dow = (int)$depd->format('N');
    $depd->add(new DateInterval('P' . ((7 + $dayOf - $dow) % 7) . 'D'));
    echo 'Payment due date is: ' . $depd->format('Y-m-d') . "\n";
    return $depd;
}

function payment_due_days($DepartureDate, $dayOf) {
    // get payment due date
    $depd = payment_due_date($DepartureDate, $dayOf);
    $today = new DateTime();
    // need to set time to 0 to match $DepartureDate
    $today->setTime(0,0);
    $interval = $today->diff($depd);
    $days = (int)$interval->format('%r%a');
    if ($days == 0)
        echo "Payment is due today\n";
    else if ($days > 0)
        echo "Payment is due in $days days\n";
    else
        echo "Payment was due " . abs($days) . " days ago\n";
    return $days;
}

payment_due_days('2018-05-01', 2);
payment_due_days('2018-05-01', 4);
payment_due_days('2018-05-09', 2);
payment_due_days('2018-04-20', 2);
payment_due_days('2018-05-18', 3);
payment_due_days('2018-06-02', 4);

Выход (на основе сегодняшнего дня = '2018-04-30'):

Payment due date is: 2018-05-01
Payment is due in 1 days
Payment due date is: 2018-05-03
Payment is due in 3 days
Payment due date is: 2018-05-15
Payment is due in 14 days
Payment due date is: 2018-04-24
Payment was due 6 days ago
Payment due date is: 2018-05-23
Payment is due in 23 days
Payment due date is: 2018-06-07
Payment is due in 38 days

Обратите внимание, что причина, по которой мы используем (7 + $dayOf - $dow) % 7, заключается в том, что PHP возвращает отрицательные числа от %, если значение отрицательное. В противном случае мы будем использовать ($dayOf - $dow) %7. По этой причине в вашем коде указана неверная дата отправления 9 мая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...