Задать вопрос
another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как правильно сравнить время?

Собственно задача:
Перебрать временной массив вида
[
0 => '12:05',
1 => '14:05',
2 => '16:05',
3 => '18:05',
4 => '20:05'
]

И каждый элемент, переведя в формат даты, сравнить с текущим временем и если, например, текущее время 17:45, т.е текущее время максимум на 15-20 минут меньше чем то, которое является значением элемента массива в текущей итерации, то вытащить все элементы(с 0 по 3 в данном случае).
Через foreach прохожусь по массиву, время привел к формату DateTime, дабы можно было сравнивать простыми операторами сравнения. И разницу узнаю через DateTime::diff(), но этот метод показывает разницу по модулю, т.е не ясно, больше текущее время или меньше, чем то, которое является значением элементы текущей итерации цикла. Как быть? Возможно есть более простой путь для решения задачи? Код прикрепляю ниже. Спасибо.

$dateToday = new DateTime ('NOW');
$timesClose['time'] = array(    // Значения динамические
0 => '12:05',
1 => '14:05',
2 => '16:05',
3 => '18:05',
4 => '20:05'
); 
foreach ($timesClose['time'] as $key => $val) {
        $val  = date_create_from_format('H:i', $val);
        $diff = date_diff($val, $dateToday);
        if ($dateToday < $val && $diff->format('%i%') < 30) { // Максимально допустимая разница 30 минут;
            $number = $key; // $number используется в дальнейшем, чтобы сделать срез массива
            break;
        }
}
  • Вопрос задан
  • 6550 просмотров
Подписаться 3 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
$times = ['12:05', '14:05', '16:05', '18:05', '20:05'];
$now = new \DateTime();
$filteredTimes = array_filter($times, function ($time) use ($now) {
    $diff = (new \DateTime($time))->diff($now);
    // оставляем в массиве только время
    // которое наступит только через пол часа минимум.
    return $diff->invert && $diff->h * 60 + $diff->i > 30;
});


ideone.com/7f4jcN
Ответ написан
KorsaR-ZN
@KorsaR-ZN
Замените $diff->format('%i%'); на (int)$diff->format('%R%i%');
будет со знаком выводить, если < 0, значит первая дата больше второй.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
сконверть mktime в стандартное юних время и сравнивай их, гораздо понятней и красивей
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽