Проблема со сравнением дат

Главные вкладки

Аватар пользователя scrobot scrobot 19 октября 2013 в 15:40

Доброго времени суток. Есть небольшая проблемка, не могу понять в чем ошибка, подскажите пожалуйста.
Необходимо во вьюхе сравнить даты, и если сегодняшняя дата больше чем поле даты материала, то должна выводится строка "Закончилась", если же меньше, то должна выводится сама дата. Я темизировал вьюху, в итоге вот что получилось

<?php
print $fields['field_thumbnail']->content;
print 
$fields['title']->content;
print 
$fields['body']->content;
$now date('d.m.Y');
$userDate $fields['field_dateuser']->content;
echo 
$now;
echo 
$userDate;
if( 
$userDate $now) {
    echo 
'Закончилась';
}
else {
    print 
$fields['field_dateuser']->content;
}

?>

результат можно увидеть здесь
Проблема вот в чем, если ставить знак > то все записи выводят значение "Закончилась", а сейчас все записи выводят дату. Т.е. сам скрипт сравнения работает. Если же перменную $userDate привести к типу времени при помощи функции strrotime(), то значение переменной не выводится вообще. В общем я не могу понять в чем дело, и как это решить. Помогите пожалуйста.

Комментарии

Аватар пользователя scrobot scrobot 19 октября 2013 в 17:06

Ну это не ответ, вы думаете я не гуглил по этому вопросу? Тут проблема в том, что со значением $fields['field_dateuser']->content; ничего не получается сделать. Если использовать функцию mktime то если для сегодняшней даты все понятно, то как поступить вставить значение поля field_dateuser в функцию mktime во вьюшке?

Аватар пользователя sergeybelya sergeybelya 19 октября 2013 в 17:19

scrobot wrote:
Ну это не ответ, вы думаете я не гуглил по этому вопросу? Тут проблема в том, что со значением $fields['field_dateuser']->content; ничего не получается сделать. Если использовать функцию mktime то если для сегодняшней даты все понятно, то как поступить вставить значение поля field_dateuser в функцию mktime во вьюшке?

Вы некорректно сравниваете даты, а сравниваете строки.

Аватар пользователя scrobot scrobot 19 октября 2013 в 17:29

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

$now = date('d.m.Y');
$intNow = (int) $now;
$userDate = $fields['field_dateuser']->content;
$intUD = (int) $userDate;
echo $intNow;
echo $intUD;
if( $intUD < $intNow) {
echo 'Закончилась';
}
else {
print $userDate;
}

а в результате переменная $intUD вообще не выводится. И так при любых действиях. В чем причина я понять не могу.

"sergeybelya" wrote:
Вы некорректно сравниваете даты, а сравниваете строки.

я с самого начала попытался сделать так
if( strtotime($userDate) < strtotime($now)) - но результата не получил никакого.

Аватар пользователя sergeybelya sergeybelya 19 октября 2013 в 17:33

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

$now = date('d.m.Y');
$intNow = (int) $now;
$userDate = $fields['field_dateuser']->content;
$intUD = (int) $userDate;
echo $intNow;
echo $intUD;
if( $intUD < $intNow) {
echo 'Закончилась';
}
else {
print $userDate;
}

а в результате переменная $intUD вообще не выводится. И так при любых действиях. В чем причина я понять не могу.

"sergeybelya" wrote:
Вы некорректно сравниваете даты, а сравниваете строки.

я с самого начала попытался сделать так
if( strtotime($userDate) < strtotime($now)) - но результата не получил никакого.

Из вашего примера неясно, в каком формате вы храните дату в поле field_dateuser. Вы используете модуль Date?

Аватар пользователя scrobot scrobot 19 октября 2013 в 17:32

Извините, я маленько ошибся. Переменная $intUD выводится, только со значением 0. Очередной вопрос - почему 0? (((

Аватар пользователя scrobot scrobot 19 октября 2013 в 17:58

"sergeybelya" wrote:
Из вашего примера неясно, в каком формате вы храните дату в поле field_dateuser. Вы используете модуль Date?

Нет, просто текстовая строка

Аватар пользователя sergeybelya sergeybelya 19 октября 2013 в 18:02

scrobot wrote:
"sergeybelya" wrote:
Из вашего примера неясно, в каком формате вы храните дату в поле field_dateuser. Вы используете модуль Date?

Нет, просто текстовая строка

Формат строки?

Аватар пользователя scrobot scrobot 19 октября 2013 в 18:13


тип поля Текст, виджет "текстовое поле". Получается string. я его привожу к integer. И в итоге он мне выводит его как 0.

Аватар пользователя sergeybelya sergeybelya 19 октября 2013 в 22:53

scrobot wrote:

тип поля Текст, виджет "текстовое поле". Получается string. я его привожу к integer. И в итоге он мне выводит его как 0.

Вы не поняли. Я спрашиваю про формат строки даты, как вы ее храните? например "19.10.2013" или "2013-10-19".

Аватар пользователя scrobot scrobot 20 октября 2013 в 10:06

"sergeybelya" wrote:
Вы не поняли. Я спрашиваю про формат строки даты, как вы ее храните? например "19.10.2013" или "2013-10-19".

Да, извините, не понял. Именно так как вы указали - 19.10.2013

Аватар пользователя sergeybelya sergeybelya 20 октября 2013 в 12:09

Тогда работайте с strtotime
http://ua2.php.net/manual/ru/function.strtotime.php, проверьте внимательно свой код еще раз. Приведение к целому числу делать не нужно. У вас должно быть что-то вроде этого

if (strtotime($userDate) < strtotime($now)) {...}

Аватар пользователя scrobot scrobot 20 октября 2013 в 14:28

"sergeybelya" wrote:
Тогда работайте с strtotime
http://ua2.php.net/manual/ru/function.strtotime.php, проверьте внимательно свой код еще раз. Приведение к целому числу делать не нужно. У вас должно быть что-то вроде этого
if (strtotime($userDate) < strtotime($now)) {...}

Делал - не дает положительного результата. Вот посмотрите http://befree.yobrand.ru/promotions

$intNow: 20.10.2013
$intUD: 01.01.2001
strtotime($intNow)1382198400
strtotime($intUD)
Результат: Закончилась

Вот что выводит в ответ на мой код

<?php$now = date('d.m.Y');
$userDate = $fields['field_dateuser']->content;
echo "\$intNow: ".$now."<br/>";
print "\$intUD: ".$userDate."<br/>";
$now = strtotime($now);
$userDate = strtotime($userDate);
echo 'strtotime('."\$intNow".')'.$now."<br/>";
print 'strtotime('."\$intUD".')'.$userDate."<br/>";

    if($userDate < $now) {
        echo 'Результат: Закончилась';
    }
    else {
        print 'Результат: '.$userDate;
    }?>

?>
В общем как видите не работает такой ход. Это один из первых вариантов которые я испробовал вместе с mktime()

Аватар пользователя Nezateya Nezateya 20 октября 2013 в 17:32

<?php
$now 
date('d.m.Y');
$userDate $fields['field_dateuser']->content;
echo 
"\$intNow: ".$now."<br/>";
print 
"\$intUD: ".$userDate."<br/>";
echo 
'strtotime('."\$intNow".')'.strtotime($now)."<br/>";
print 
'strtotime('."\$intUD".')'.strtotime($userDate)."<br/>";

    if(

strtotime($userDate) < strtotime($now)) {
        echo 
'Результат: Закончилась';
    }
    else {
        print 
'Результат: '.strtotime($userDate);
    }
?>

Попробуйте так на первый взгляд одно и тоже, но попробуйте )) мне просто ща не когда тестить

Аватар пользователя Dalay Dalay 20 октября 2013 в 23:19

Охх, дядьки... )

<?php

// СТРОКА с датой в обозначенном формате ('день.месяц.год').
$userDate '19.09.2013';

// Юникс-тайм для проверяемого ДНЯ.
$userDate_timestamp strtotime($userDate);

// Юникс-тайм для текущего ДНЯ.
$now_timestamp mktime(000);

$result = ($userDate_timestamp $now_timestamp) ? 'Закончилась' $userDate;

print 

"Результат: $result";

?>
Аватар пользователя drupby drupby 20 октября 2013 в 23:00
// СТРОКА с датой в обозначенном формате ('день.месяц.год').
$userDate = '19.09.2013';

// Юникс-тайм для проверяемого ДНЯ.
$userDate_timestamp = strtotime($userDate);

// Юникс-тайм для текущего ДНЯ.
$now_timestamp = strtotime('now');

$result = ($userDate_timestamp < $now_timestamp) ? 'Закончилась' : $userDate;

print "Результат: $result";

Аватар пользователя Dalay Dalay 20 октября 2013 в 23:04

"drupby" wrote:
$now_timestamp = strtotime('now');

timestamp тогда с текущим временем определяется, челу надо оное по нулям.

Аватар пользователя drupby drupby 20 октября 2013 в 23:12

"Dalay" wrote:
timestamp тогда с текущим временем определяется, челу надо оное по нулям.

ну так я прочитал в самом топике написано
"scrobot" wrote:
если сегодняшняя дата

Аватар пользователя Dalay Dalay 20 октября 2013 в 23:39

"drupby" wrote:
ну так я прочитал в самом топике написано

"scrobot" wrote:
Необходимо во вьюхе сравнить даты, и если сегодняшняя дата больше чем поле даты материала...

https://www.google.ru/search?q=define:дата

upd: хотя оно фиолетово так-то, но тогда уж просто time() )

Аватар пользователя drupby drupby 20 октября 2013 в 23:41

"Dalay" wrote:
Необходимо во вьюхе сравнить даты, и если сегодняшняя дата больше чем поле даты материала...
https://www.google.ru/search?q=define:дата

ну хорошо если поле даты 17 часов сегодняшнего дня
на данный момент 15 часов -событие не совершилось
если 19 часов - совершилось
а у тебя сравнивается с 00:00:00

хотя посмотрел на то что ему надо получить по ссылке там действительно дата сравнивается
а я то думал у него там какие то события происходят в определенное время

Аватар пользователя Dalay Dalay 20 октября 2013 в 23:41

"drupby" wrote:
ну хорошо если поле даты 17 часов сегодняшнего дня
на данный момент 15 часов -событие не совершилось
если 19 часов - совершилось
а у тебя сравнивается с 00:00:00

) Так если у нас $userDate = '19.09.2013', то причем тут 15 часов?

Аватар пользователя Nezateya Nezateya 21 октября 2013 в 4:43

а по моему у него всё правильно было ) единственная ошибка в этих строках

<?php
$now 
strtotime($now);
$userDate strtotime($userDate);
?>

но я нюансов php не знаю ) возможно php умеет менять типы переменных на ходу Smile
я в других языках кодил всегда ) там так нельзя было Smile

Аватар пользователя scrobot scrobot 21 октября 2013 в 10:39

Спасибо всем за обсуждение, но опять 25((

"Dalay" wrote:
<?php

// СТРОКА с датой в обозначенном формате ('день.месяц.год').
$userDate = '19.09.2013';

// Юникс-тайм для проверяемого ДНЯ.
$userDate_timestamp = strtotime($userDate);

// Юникс-тайм для текущего ДНЯ.
$now_timestamp = mktime(0, 0, 0);

$result = ($userDate_timestamp < $now_timestamp) ? 'Закончилась' : $userDate;

print "Результат: $result";

?>

если $userDate задана в коде, как у вас $userDate = '19.09.2013', то все работает. Но мне надо чтобы дату задавал юзер. и если делать так как я делал раньше $userDate = $fields['field_dateuser']->content; также не работает((
По логике все верно, но вот почему то я никак не могу манипулировать этими значениями из поля field_dateuser

Аватар пользователя sergeybelya sergeybelya 21 октября 2013 в 11:17

scrobot wrote:
Спасибо всем за обсуждение, но опять 25((
"Dalay" wrote:
<?php

// СТРОКА с датой в обозначенном формате ('день.месяц.год').
$userDate = '19.09.2013';

// Юникс-тайм для проверяемого ДНЯ.
$userDate_timestamp = strtotime($userDate);

// Юникс-тайм для текущего ДНЯ.
$now_timestamp = mktime(0, 0, 0);

$result = ($userDate_timestamp < $now_timestamp) ? 'Закончилась' : $userDate;

print "Результат: $result";

?>

если $userDate задана в коде, как у вас $userDate = '19.09.2013', то все работает. Но мне надо чтобы дату задавал юзер. и если делать так как я делал раньше $userDate = $fields['field_dateuser']->content; также не работает((
По логике все верно, но вот почему то я никак не могу манипулировать этими значениями из поля field_dateuser

Проверьте исходный код этого поля $fields['field_dateuser']->content, возможно там строка с датой завернута в теги html, вы уверены что там только дата?

Аватар пользователя scrobot scrobot 21 октября 2013 в 12:10

Вот какой html-код генерируется друпалом

    <div class="views-label-field-dateuser">
        <div class="field-content">01.01.2001</div>
    </div>

Честно говоря лично я в этом не вижу проблем. Мне кажется обертка с классом field-content не должна создавать таких проблем.

Аватар пользователя sergeybelya sergeybelya 21 октября 2013 в 12:23

scrobot wrote:
Вот какой html-код генерируется друпалом

    <div class="views-label-field-dateuser">
        <div class="field-content">01.01.2001</div>
    </div>

Честно говоря лично я в этом не вижу проблем. Мне кажется обертка с классом field-content не должна создавать таких проблем.

Блин, ну вы даете:), пропустите через strip_tags

Аватар пользователя drupby drupby 21 октября 2013 в 13:13

"sergeybelya" wrote:
Блин, ну вы даете:), пропустите через strip_tags

ну вообще то объект поля уже должен содержать его значение - просто вывести и посмотреть на все его свойства

Аватар пользователя sergeybelya sergeybelya 21 октября 2013 в 14:13

drupby wrote:
"sergeybelya" wrote:
Блин, ну вы даете:), пропустите через strip_tags

ну вообще то объект поля уже должен содержать его значение - просто вывести и посмотреть на все его свойства

я-то это понимаю, но человек выводит через content поля вьюхи, пусть уберет теги для начала и убедиться что в них причина.

Аватар пользователя scrobot scrobot 21 октября 2013 в 15:31

Ну алилуя))) Заработало!)) Всем огромное спасибо!! прям спасибище! ^_^
В общем на самом деле сыграла моя невнимательность) Мешала именно эта обертка, которая выводилась. Убрав обертку, все заработало так как надо. Просто получилось что сравнивалась дата в формате 21.10.2013 со строкой "

01.01.2001

" и в этом была вся проблема.
Огромное спасибо всем участвующим. Решение найдено)