проблема с датой php, иногда 1 становится нулевым

#php

#php

Вопрос:

давний читатель, первое сообщение.

У нас есть открытый список проблем на нашем веб-сайте, проблемы автоматически просрочены по достижении установленного срока. Раньше код работал нормально, но в последнее время начал вести себя нелогично, и это поджаривает мой мозг, пытаясь выяснить, почему.

Веб-сайт размещен на wordpress, но я считаю, что проблема заключается в базовой проблеме PHP.

Это очень простой вызов функции date-&&t; diff, но иногда он возвращает 1, а иногда и ноль, в тот же день при тех же условиях. Это приводит к тому, что проблема просрочена множество раз, а не только один раз.

Проблемный раздел кода (содержится в foreach $issues как цикл $issue):

 $status = false;
$DEBUG = 'issue ID: '.$issue-&&t;ID;

$today = new DateTime("now");
$today-&&t;setTime(0, 0, 0); //added this line, as su&&ested by Sascha

$issue_due = date_create_from_format("Y-m-d", $issue-&&t;Due_Date);
$diff = $today-&&t;diff($issue_due);
$diff = $diff-&&t;format('%r%a');//format as days with positive/ne&ative symbol

//if issue due date is before today and status is not past_due
if ($diff < 0
amp;amp; $issue-&&t;Status != 'past_due')
{        
    $DEBUG.= ', issue status: '.$issue-&&t;Status.' to past_due, today: '.$today-&&t;format('d-m-Y').', due: '.$issue_due-&&t;format('d-m-Y').', diff: '.$diff;
    //update to past due and mail responsible and (optionally) creator (if not the same person, else send creator mail only)
    $status='past_due';
}
//if issue due date is within 5 days of today and status is not due_soon
if($diff <= 5
amp;amp; $diff &&t;= 0
amp;amp; $issue-&&t;Status != 'due_soon')
{
    //update to due soon and mail to responsible person
    $DEBUG.= ', issue status: '.$issue-&&t;Status.' to due_soon, today: '.$today-&&t;format('d-m-Y').', due: '.$issue_due-&&t;format('d-m-Y').', diff: '.$diff;
    $status='due_soon';
}
if($diff &&t; 5
amp;amp; $issue-&&t;Status != 'open')
{
    $DEBUG.= ', issue status: '.$issue-&&t;Status.' to open, today: '.$today-&&t;format('d-m-Y').', due: '.$issue_due-&&t;format('d-m-Y').', diff: '.$diff;
    $status='open';
}
  

Строки отладки возвращаются следующим образом:

идентификатор проблемы: 4181, статус проблемы: от due_soon до past_due, сегодня: 18-08-2020, срок выполнения: 17-08-2020, разница: -1, время: 18-04 августа:12

идентификатор проблемы: 4181, статус проблемы: от прошлой до due_soon, сегодня: 18-08-2020, срок выполнения: 17-08-2020, разница: -0, время: 18-11 августа: 22

идентификатор проблемы: 4181, статус проблемы: от due_soon до past_due, сегодня: 18-08-2020, срок выполнения: 17-08-2020, разница: -1, время: 18-11: 22 августа

идентификатор проблемы: 4181, статус проблемы: от прошлой до due_soon, сегодня: 18-08-2020, срок выполнения: 17-08-2020, разница: -0, время: 18-11 августа:31

идентификатор проблемы: 4181, статус проблемы: из-за_суна в прошедшее_день, сегодня: 18-08-2020, срок выполнения: 17-08-2020, разница: -1, время: 18-11 августа:33

Это происходит не каждый раз, когда кто-то обращается к сайту, хотя код запускается при каждом доступе к странице. Это может происходить разное количество раз для разных проблем, возникающих в один и тот же день. Больше ничего не имеет смысла, я упускаю что-то очевидное?

Ответ №1:

Вы создаете дату на данный момент, но это не только дата, у нее также есть время, и у вашей даты сравнения это тоже есть. Таким образом, это зависит от времени их обоих, если результат равен 0 или 1.
Вы могли бы установить для обеих дат для целей сравнения одно и то же время (часы, минуты, секунды и миллисекунды. Другой способ — получить из обоих дней год, месяц и дни и создать из этого новую дату, чтобы у обоих было одинаковое время. Если вам нужна разница в днях, установите время лучше равным 12, чтобы у вас не возникло проблем с изменением времени для летнего / зимнего времени.

Комментарии:

1. Я понимаю вашу точку зрения, но если вы посмотрите на мои строки отладки, один и тот же код запускается дважды (или более раз, в зависимости от обращений к странице) в одну и ту же минуту (посмотрите на значение времени в конце строки), поэтому, насколько я понимаю, время не должно иметь значения в этом случае?

2. Хорошо, я этого не видел. Это не та проблема, которую вы ищете, но, вероятно, это может быть другая проблема в зависимости от бизнес-процессов