Оператор PHP If/else с отформатированной датой для определения части дня

Я пытаюсь сделать простой оператор if/else в PHP. Что-то простое вроде этого:

<?php 
$time = 13;
if ($time < 12) {
  echo "Morning";
} else {
  echo "Afternoon or evening";
}
?>

Проблема в том, что значение, которое я получаю из базы данных, представляет собой неформатированный формат времени (например: 2014-09-08 06:00:00). Я могу отформатировать эту дату, используя:

$time->format('H');

Чтобы удалить дату из дня, месяца и года. Но вы не можете использовать это как переменную. Вот что я пытаюсь сделать:

<?php $deliverytime = new DateTime('2014-09-08 06:00:00');
$deliverytime->format('H');
if ($deliverytime < 12) {
  echo "Morning";
} else {
  echo "Afternoon or evening";
}
?>

Теперь это не работает, потому что я пытаюсь использовать отформатированную дату в качестве переменной, которая не работает. Есть ли другой способ определить часть дня, используя отформатированную дату?

С уважением, Маттейс


person user3166736    schedule 22.01.2015    source источник
comment
неформатированный формат времени (например: 2014-09-08 06:00:00) Мне кажется, формат времени довольно хорош!   -  person Lightness Races in Orbit    schedule 22.01.2015


Ответы (4)


<?php 
     $deliverytime = new DateTime('2014-09-08 06:00:00');
     $hour = $deliverytime->format('H');
     if ($hour < 12) {
       echo "Morning";
     } else {
       echo "Afternoon or evening";
     }
?>

$deliverytime->format() — это метод, который возвращает отформатированную дату, и вы должны где-то сохранить ее, чтобы использовать то, что возвращает этот метод, как показано в приведенном выше коде.

Как бы то ни было, вы передаете весь объект оператору if, вам нужен только результат метода, который вы используете.

person vcanales    schedule 22.01.2015
comment
Это было бы правильным решением, поскольку оно может принимать почти все форматы времени, предоставляемые базой данных (как указано в OP). - person AnotherGuy; 22.01.2015
comment
Спасибо. Ломал голову над этим. - person user3166736; 22.01.2015

Я бы не стал использовать DateTime для чего-то такого простого. Вот что я бы сделал:

$date = "2014-09-08 06:00:00";
$date = strtotime($date);
if (date('H', $date) < 12){
  echo "Morning";
} else {
  echo "Afternoon or evening";
}
person JokiRuiz    schedule 22.01.2015
comment
Почему бы и нет? Это превосходное решение. - person Lightness Races in Orbit; 22.01.2015
comment
Кроме того, первые 2 строки и часть оператора if можно сократить: $hour = date("H", strtotime("2014-09-08 06:00:00")); if ($hour < 12) ... - person Tim Lewis; 22.01.2015
comment
@LightnessRacesinOrbit Создание экземпляра класса в PHP обычно обходится дорого. - person JokiRuiz; 22.01.2015
comment
@JokiRuiz: Мои тесты показывают, что ваш подход почти вдвое медленнее, чем DateTime ( strtotime: 1219,90 мс против DateTime: 773,98 мс) - person Lightness Races in Orbit; 22.01.2015
comment
@TimLewis: я не знаю ... установка $date затем применение strtotime хорошо читается и делает код более удобным для сопровождения. Конденсация вещей не всегда полезна. - person Lightness Races in Orbit; 22.01.2015
comment
@LightnessRacesinOrbit Эх, я наполовину с тобой согласен. На самом деле зависит от того, что вы делаете с переменной за пределами ее объявления. - person Tim Lewis; 22.01.2015
comment
@TimLewis: Да, иногда :) - person Lightness Races in Orbit; 22.01.2015
comment
@LightnessRacesinOrbit, вы чертовски правы, DateTime хорошо оптимизирован в PHP. В вашем случае это быстрее из-за вызова date(). Но только при создании объекта разница довольно мала ссылка Ура! - person JokiRuiz; 22.01.2015
comment
@JokiRuiz: Да, это только показывает, что ваше заявление о создании экземпляра класса в PHP в целом дорого, но это не так. :) - person Lightness Races in Orbit; 22.01.2015

Возможно, это не лучший способ, но вы также можете получить значение, используя preg match:

preg_match('/[0-9]{4}\-[0-9]{2}-[0-9]{2} 0?([0-9]+)\:[0-9]{2}\:[0-9]{2}/', $date, $match);
$hour = intval($match[1]);
person Bart Haalstra    schedule 22.01.2015

Но вы не можете использовать это как переменную

Да, ты можешь. Это отлично работает:

<?php 
    $deliverytime = new DateTime('2014-09-08 06:00:00');
    $hour = (int) $deliverytime->format('H');

    if ($hour < 12) {
        echo "Morning";
    } else {
        echo "Afternoon or evening";
    }
?>
person rwacarter    schedule 22.01.2015
comment
Я забыл сохранить переменную после ее форматирования. Виноват. Спасибо за помощь. - person user3166736; 22.01.2015