Раунд Datetime до следующих 15 минут - PullRequest
0 голосов
/ 18 июня 2019

в моем проекте мне нужно округлить дату, например, с "08:10" до "08:00".

больше примеров

"от 8:20 до 8:15" "8:31 до 8:30 "

И на следующем шаге мне нужен дополнительный метод для округления.

пример" 8:20 до 8:30 "" 8:31 до 8: 45 "

$shiftInPre = new \DateTime($row["time_start"] /* <-e.g. 8:02*/);
echo roundtoLastQuarterHour($shiftInPre);

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Если у вас есть только H:i и не полная дата / время, используйте базовые строковые операции

$shiftInPre = '8:07';
list($hours, $mins) = explode(':', $shiftInPre);
$mins = $hours * 60 + $mins;

$rounded = round($mins / 15) * 15;
echo floor($rounded / 60) . ':' . str_pad($rounded % 60, 2, 0); 
// 8:07 >> 8:00
// 8:08 >> 8:15
// 8:18 >> 8:15
0 голосов
/ 18 июня 2019

Если вам действительно нужно / хотите использовать DateTime -объекты, вы можете манипулировать DateTime -объектом с помощью modify -метода на основе минут, а после этого обнулять секунды и микросекунды с помощью setTime -метод.

// round (floor)
$date = new DateTime('2019-01-01T15:03:01.012345Z');
$i = $date->format('i') % 15;
$date->modify("-{$i} minute");
$date->setTime($date->format('H'), $date->format('i'), 0, 0);
var_dump($date);
// round (ceil)
$date = new DateTime('2019-01-01T15:03:01.012345Z');
$i = 15 - ($date->format('i') % 15);
$date->modify("+{$i} minute");
$date->setTime($date->format('H'), $date->format('i'), 0, 0);
var_dump($date);

Демо: https://3v4l.org/MIGiG

Этот подход имеет преимущество для правильной обработки времени, которое будет округлено до следующего дня.

Но если вам нужно только «округлить» простую строку, содержащую часы и минуты, тогда достаточно решения, включающего взрыв и простую математику (см .: Ответ опубликованной пантеры ).

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