Помогите с логическими выражениями

261
18 января 2017, 02:33

Здравствуйте! вот код

    <?
date_default_timezone_set("UTC");
$time = time(); // Вот это значение отправляем в базу
  $offset = 3; // Допустим, у пользователя смещение относительно Гринвича составляет +3 часа
  $time += 3 * 3600;
$a = strtotime(date("H:i:s", $time));
$b = strtotime($post['time']);
?>
<? echo date("H:i:s",$a)?> - <br> <?echo date("H:i:s",$b) ?> =
<?
if($a>$b){
    if(($b-$a)>60*60){
        echo date("H", $a - $b). " hours remaining";
    }else{
        echo date("i", $a - $b). " minutes ago";
    }
}elseif($b==$a){
    echo 'Live';
}else{
    echo date("H", $b - $a). " hours ago";
}

?>

Который выдаёт: Что никак не является актуальной, в чём проблема и как ее решить?

Answer 1

Итак

Функция date

date — Форматирует вывод системной даты/времени

string date ( string $format [, int $timestamp = time() ] )

Возвращает строку, отформатированную в соответствии с указанным шаблоном format. Используется метка времени, заданная аргументом timestamp, или текущее системное время, если timestamp не задан. Таким образом, timestamp является необязательным и по умолчанию равен значению, возвращаемому функцией time().

Функция time

time — Возвращает количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT) до текущего времени.

$a = date("H:i:s", $time);

В переменной $a и переменной $b хранится строка вида ="8:24:00".

При этом мы помним что функция date() принимает в качестве второго аргумента целое число.

date("i", $b - $a)

В вашем же примере вы передаёте туда разность двух строк

В качестве эксперимента посмотрим что получится в результате вычитания одной сформатирванной строки из другой:

<?php
$a="8:24:00";
$b="8:23:00";
echo $a-$b; 
?>
output:
>0

Что и следовало ожидать.

Дальше вы передаёте ноль в функцию date()

<?php
echo date("i",0);
?>
output:
>00

Ровно это мы и видем на скриншоте.

Вам следовало воспользоваться функцией strtotime() И хранить в переменных количество секунд в виде целого числа. Их гораздо проще сравнивать и вычитать.

$a = time()+3*60*60;
$b = strtotime($post['time']);

Учтём, что Вы заменили поле с формата TIME на DATETIME.

Если разница во времени больше суток, то выведем количество оставшихся дней.

Если разница во времени больше месяца, то выведем количество оставшихся месяцев.

Если разница во времени больше года, то выведем количество оставшихся лет.

Т.к. нам не нужна лишняя детализация в функции будет возвращать максимальныый возможный разряд.

Чтобы не повторять несколько раз лапшу из if'ов выделим это дело в отдельную функцию.

В итоге получается вот так:

<?
date_default_timezone_set("UTC");
$a = time()+3*60*60;
$b = strtotime($post['time']);
?>
<? echo date("d.m.Y H:i:s",$a)?> - <br> <?echo date("d.m.Y H:i:s",$b) ?> =
<?
function time_diff_format($diff){
    if (($diff) > 86400*365)
        return  round($diff/(86400*365)) . " years ";
    if (($diff) > 86400*31)
        return  round($diff/(86400*30)) . " months ";
    if (($diff) > 86400)
        return  round($diff/(86400)) . " days ";
    if (date("H", $diff) != "00")
        return  round($diff/(3600)) . " hours ";
    if (date("i", $diff) != "00")
        return  round($diff/(60)) . " minutes ";
}
if($b>$a){
    echo datetime_diff($b - $a)." remaining";
}elseif(($a==$b) || $post['live']==1){
    echo datetime_diff($a - $b)." ago, <span style='color: #72A326; text-shadow: 1px 1px 0px #4A7010; font-weight: bold;'> LIVE</span>";
}else{
    echo datetime_diff($a - $b)." ago";
}

К сожалению, вопрос получился очень обширным и я не могу изложить всё что хотел, но как автор ответа, я рекомендую для таких целей классы DateTime и DateInterval.

http://php.net/manual/ru/class.datetime.php

http://php.net/manual/ru/class.dateinterval.php

READ ALSO
Запрос на сервер с помощью curl php

Запрос на сервер с помощью curl php

Хей! Упорно, но безуспешно пытаюсь достучаться до сервера с помощью curlХочу получить ответ но в итоге получаю сообщение о ошибки ключа api

391
аналог addShutdownHook

аналог addShutdownHook

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

319
Symfony 3 авторизация

Symfony 3 авторизация

Здравствуйте, начал делать аутентификацию в проекте на Symfony 3(пишу на нем впервые) и столкнулся с такой проблемойПисал код на основе документации,...

876
preventDefault событие

preventDefault событие

Есть меню, подгружаю через jquery страницу php, содержащую форму, вот только js код игнорирует preventDefault и в итоге форма отправляется, и меня кидает...

390