Задать вопрос
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;
        }
}
  • Вопрос задан
  • 6535 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 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 в стандартное юних время и сравнивай их, гораздо понятней и красивей
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы