Как найти разницу во времени между временем PM и AM? - PullRequest
1 голос
/ 01 апреля 2020

В моей форме есть 2 Time Pickers, где пользователь может выбирать время от времени. У него нет даты, связанной с ним. И для генерации отчетов я должен рассчитать разницу во времени между ними. Это прекрасно работает, если время от и до «06:00 до 10:00», но если время от и до «21:00 до 02:00», я получаю разницу во времени в 19 часов. Не могли бы вы помочь мне исправить это.

Для этого случая «21:00 до 02:00» разница во времени должна составлять 5 часов.

Это код

$datetime1 = new \DateTime('09:30 PM');
$datetime2 = new \DateTime('02:00 AM');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%hh');

exit;

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Разница становится отрицательной, если $ totime меньше чем $ fromtime. DateInterval-> invert == 1 указывает на это. Это используется с этим коротким решением для исправления результата.

$fromtime = '09:30 PM';
$totime = '02:00 AM';

$diff = date_create($fromtime)->diff(date_create($totime));
$hours = $diff->invert ? 24-$diff->h : $diff->h;

echo $hours;  //5
0 голосов
/ 01 апреля 2020

Поскольку у вас есть 2 средства выбора даты, одно на from время, а другое to, первое всегда будет меньше, чем второе. Следовательно, когда from время больше to времени, это означает, что пользователь выбрал to со следующего дня. Если мы не добавим дату для расчета разницы, PHP примет текущую дату по умолчанию. Мы можем легко исправить это, добавив условие для сравнения времени и соответственно добавляя даты. Ниже обновленный код.

<?php

$fromtime = '09:30 PM';
$totime = '02:00 AM';
$now = new \DateTime();
$today = $now->format('Y-m-d'); // Store current date

$now->add(new DateInterval('P1D')); // Add one day to current date to get next date
$nextDay = $now->format('Y-m-d'); // Store next date

if($fromtime > $totime) // If from time is bigger than to time, it means to is a next day
{
    $fromdatetime = "$today $fromtime";
    $todatetime = "$nextDay $totime";
}
else
{
    $fromdatetime = "$today $fromtime";
    $todatetime = "$today $totime";
}

$datetime1 = new \DateTime($fromdatetime);
$datetime2 = new \DateTime($todatetime);
$interval = $datetime1->diff($datetime2);
echo $interval->format('%hh');

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