Осталось дней php

Статус
Закрыто для дальнейших ответов.

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
Столкнулся с такой проблемой: есть запись в мускуле dataregvip в которой запись 22.07.2010 -(дата активации) , еще есть deyvip в которой запись 42 -(колл-во дней). Внимание вопрос!: как сделать так чтобы было показано сколько дней осталось до окончания этих 42 дней? пробовал в unix формате не получилось или не додумался.

Сам делаю движок сайта недвижимости и для полного счастья хотел статус VIP покупной сделать. login and pass = admin
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Можно использовать функцию getdate($timestamp)
Функция возвращает ассоциативный массив, содержащий информацию даты из $timestamp или текущего локального времени, если timestamp не задан.
А среди элементов массива есть "yday" - день года (цифрой); например, "299".

Вот простенький примерчик:
Код:
<?php
// сегодня
$today = getdate ();
// дата регистрации 22.07.2010
$reg_date = mktime (0, 0, 0, 7, 22, 2010);
$a_reg_date = getdate ($reg_date);
// дата через 42 дня после регистрации
$compl_date = mktime (0, 0, 0, date ("m", $reg_date), date ("d", $reg_date)+42, date ("Y", $reg_date));
$a_compl_date = getdate ($compl_date);

echo 'Дата регистрации '.date ("d.m.Y", $reg_date).' - '.$a_reg_date['yday'].' день года<br />';
echo '42 дня после регистрации '.date ("d.m.Y",  $compl_date).' - '.$a_compl_date['yday'].' день года<br />'; 
echo 'Сегодня '.date ("d.m.Y").' - '.$today['yday'].' день года<br />';
echo 'Осталось '.($a_compl_date['yday'] - $today['yday']).' дней.';
?>
В пределах года все работает. При переходе через год, получаем отрицательный остаток, что несложно отследить и прибавить 365.

Удачи!
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
Код:
<?php
// сегодня
$today = getdate ();
// дата регистрации 22.07.2010
$reg_date = mktime (0, 0, 0, 7, 22, 2010);
$a_reg_date = getdate ($reg_date);
// дата через 42 дня после регистрации
$compl_date = mktime (0, 0, 0, date ("m", $reg_date), date ("d", $reg_date)+42, date ("Y", $reg_date));
$a_compl_date = getdate ($compl_date);

echo 'Дата регистрации '.date ("d.m.Y", $reg_date).' - '.$a_reg_date['yday'].' день года<br />';
echo '42 дня после регистрации '.date ("d.m.Y",  $compl_date).' - '.$a_compl_date['yday'].' день года<br />'; 
echo 'Сегодня '.date ("d.m.Y").' - '.$today['yday'].' день года<br />';
echo 'Осталось '.($a_compl_date['yday'] - $today['yday']).' дней.';
?>
Спасибо за помощь, данный скрипт считает неверно так как если регистрация была 22.07.2010 то закончится она должна через 42 дня примерно 24.08.2010 тоесть остаток 6 дней, а скрипт считает в 15 дней остаток.


С проблемой справился так
Код:
<?
$daysremainin= time() - 1281398400;
$yyy=42*86400 - $daysremainin;
$daysr=$yyy/86400; 
$daysremaining=(int)$daysr;
?>
Вдруг кому понадобится
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Спасибо за помощь, данный скрипт считает неверно
На здоровье!
Вы хоть запускали-то скрипт?

ss3.JPG
И что здесь неверно?

Рекомендую к изучению: "Арифметика Пупкина с картинками. Часть 2. Вычитание"
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
С проблемой справился так
Код:
<?
$daysremainin= time() - 1281398400;
$yyy=42*86400 - $daysremainin;
$daysr=$yyy/86400; 
$daysremaining=(int)$daysr;
?>
Вдруг кому понадобится
:laugh: :laugh: :laugh: Жесть!!! Говнокодинг рулит!!!! Ещё и с подписью "Вдруг кому понадобится"! Мегауниверсальное решение!
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
код предоставленный Вами работает не так как надо (показывает не верный ответ), а мое решение проще. Мой код работает как надо (просто округляет число до целого).
есть еще одно решение JAVA но его использовать не стал

Serg@NT может Вам пойти учить php?
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
код предоставленный Вами работает не так как надо (показывает не верный ответ), а мое решение проще. Мой код работает как надо (просто округляет число до целого).
есть еще одно решение JAVA но его использовать не стал

Serg@NT может Вам пойти учить php?
1) Может, вам пойти поучиться хорошим манерам?
2) Ваш код, может и работает как надо, но: во-первых, использует какие-то левые числа, типа 1281398400. Откуда оно взялось - совершенно не понятно. Соответственно, чтобы разобраться что делает ваш код всего из 4х строчек потребуется минут 15, либо читать ветку с начала. Поэтому предположить, что это может вообще когда-нибудь кому-нибудь понадобиться просто нереально, т.к. чтобы хотя бы изменить дату активации нужно ваш код просто переписать. Код Тигры, может и не делает того, что ВАМ надо, но он абсолютно понятен и логичен. И чтобы его доработать надо пару минут. Если вы знаете ПХП, конечно. А то что вы какими-то левыми вычислениями получили нужное число ещё совершенно не значит, что решение верное и вы мегапрограммист. Прежде чем хамить и предлагать учить кому-то ПХП, может сначала самому научиться?
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
код предоставленный Вами работает не так как надо (показывает не верный ответ)
Ну, знаете, батенька, если у Вас с арифметикой туго, то мой код здесь, извините, не при делах.
мое решение проще
Да Вы сами через месяц на этот шедевр глянете и нифига не поймете, что там к чему и будете биться апстену с воплями "какой м... это написал?"
Если Вы так шкодите, то не Вам указывать, кому поучить РНР, а кому нет.
Минус Вам за все это.
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
Serg@NT Я не встречал людей которые пишут в теме форума не зная вообще о чем речь...
В моем посте явно была описана проблема которую я решил соответствующим кодом. Для тех Каму сложно понять о чем речь или тех кто просто поленился прочитать самый первый пост, разъясню.

tigra60 возможно я допустил в Вашем коде какую нибудь ошибку и посчитал он мне неверно. Я выложил свой код потому что он меньше и как раз таки в нем сложнее запутаться чем в Вашем. А насчет того что я порекомендовал человеку поучить php , так потому что он кроме пустого и бессмысленного высказывания больше ничего путевого не написал. Флудить направо и налево умеет любой...

Код:
$daysremainin= time() - 1281398400; // сегодняшнее время в UNIX - время регистрации в UNIX
$yyy=42*86400 - $daysremainin; // дни умноженные на секунды - полученная разница в UNIX
$daysr=$yyy/86400;  //полученный остаток времени делим на секунды
$daysremaining=(int)$daysr; //полученный результат округляем до целого числа
И уважаемые вас никто не оскорблял в отличии от самих вас!

Serg@NT Был бы рад увидеть хоть один скрипт созданный (не переписанный) вами.

:laugh: :laugh: :laugh: Жесть!!! Говнокодинг рулит!!!! Ещё и с подписью "Вдруг кому понадобится"! Мегауниверсальное решение!
Вот эта фраза явно никому не понадобится.
 

goodier

Новичок
Регистрация
25.08.2010
Сообщения
2
zoldiar Вы просто облегчили мне жизнь написав этот простой код
Код:
<?
$daysremainin= time() - 1281398400;
$yyy=42*86400 - $daysremainin;
$daysr=$yyy/86400; 
$daysremaining=(int)$daysr;
?>
Мне так же как и Вам нужно было взять из БД Unix дату и от текущего Unix времени
отнять то что в БД и получить не 15 дней а конкретно 30 дней

Спасибо Вам Огромное zoldiar, а ребятам tigra60 и Serg@NTспасибо говорить не зачто,
так как они или слишком умные или очень тупые :blink: .
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
zoldiar и goodier — это один и тот же человек?

Твой код обозвали говнокодом наверное только потому, что в нём используются "магические цифры". Если бы ты вместо 42 и 1281398400 подставил переменные со значениями из базы данных — то наверное это был бы уже не говнокод. (Хотя конечно против 42 трудно спорить :rolleyes: )
Без комментариев и с магическими цифрами трудно уловить логику в этих пускай даже 4-ёх строчках. Но самое главное, код то рабочий. Я бы, например, записал это вообще в одну строку. Только написал бы комментарий с описанием, что вычисляет эта строчка. Если бы тот, кому довелось бы после меня поддерживать этот код не понял бы ничего — ну его проблемы, пускай перепишет эту строчку.

Вы просто облегчили мне жизнь написав этот простой код
А код, кстати, действительно простой.
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
zoldiar и goodier — это один и тот же человек?
Не имею детской глупости авторизовываться под разными логинами и писать.

Я не понимаю чем мои магические цифры отличаются от магических Ваших переменных? Единственная моя ошибка в том что не прокомментировал каждое действие. Но думаю кто читал суть проблемы , тот догадался бы что и где...
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Serg@NT Был бы рад увидеть хоть один скрипт созданный (не переписанный) вами.
Почитайте другие ветки в форуме, наверное мне 130 плюсов дали не только за такие комментарии, как к вашему коду.

Собственно, почему я ваш код назвал говнокодом, все уже написали. Как вариант, я бы лично заменил числа вроде 84600 на (24*60*60) - тогда и без комментариев будет понятно, что это количество секунд в сутках, не говоря уж о 1281398400.
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Да что ж Вы никак не угомонитесь!

goodier! Специально для Вас!
Жизнь не так легка, как Вам кажется!

Вот код, в котором мой вариант и вариант zoldiar:
Код:
<?php
// сегодня
$today = getdate ();
// дата регистрации 22.07.2010
$reg_date = mktime (0, 0, 0, 7, 22, 2010);
$a_reg_date = getdate ($reg_date);
// дата через 42 дня после регистрации
$compl_date = mktime (0, 0, 0, date ("m", $reg_date), date ("d", $reg_date)+42, date ("Y", $reg_date));
$a_compl_date = getdate ($compl_date);

echo 'Дата регистрации '.date ("d.m.Y", $reg_date).' - '.$a_reg_date['yday'].' день года<br />';
echo '42 дня после регистрации '.date ("d.m.Y",  $compl_date).' - '.$a_compl_date['yday'].' день года<br />'; 
echo 'Сегодня '.date ("d.m.Y").' - '.$today['yday'].' день года<br />';
echo 'Осталось '.($a_compl_date['yday'] - $today['yday']).' дней.';
?>
<hr />
<?php
$daysremainin= time() - 1281398400;
$yyy=42*86400 - $daysremainin;
$daysr=$yyy/86400; 
$daysremaining=(int)$daysr;

echo 'Осталось '.$daysremaining.' дней';
?>
А вот результат его работы:
ss4.JPG
Как видите - результат разный - 8 дней и 26 дней.

Теперо считаем на пальцах:
Дата регистрации 22.07
В июле 31 день, минус 22 будет 9.
В августе 31 день плюс 9 будет 40.
Еще два дня - итого срок наступает 2.09.
Сегодня 25.08
В августе 31 день, минус 25 будет 6.
Плюс два дня сентября - сколько будет?
8 или 26?

Если бы zoldiar в своем коде время регистрации определял по людски, а не проктологически (1281398400 - это жесть), то это был бы нормальный код и работал бы правильно.

Надеюсь теперь все понятно и нет почвы для возмущения?
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
Если это 1281398400 для Вас жесть то, я вообще не понимаю зачем сюда пришёл за советом.
для одаренных
date("d.m.Y","1281398400"); - 10.08.2010
для еще более одаренных
date("d.m.Y","1281398400"); - 10.08.2010 //конвертация unix в нормальный формат даты
84600 и (24*60*60) кому как нравится, можно и в крестики нолики поиграть. Стиль написания у всех разный.

Можно сделать код как реферат на несколько страниц , а можно и по короче.
Вопрос был задан как узнать сколько дней до конца определенного периода осталось, а не сколько дней в году, в месяце и т.д.

В общем господа супер программисты дискуссия завершена, закрывайте тему.
 

goodier

Новичок
Регистрация
25.08.2010
Сообщения
2
Как вариант, я бы лично заменил числа вроде 84600 на (24*60*60) - тогда и без комментариев будет понятно, что это количество секунд в сутках, не говоря уж о 1281398400.
Да причем тут (24*60*60) ему так же как и мне нужно было взять из таблицы в БД значение сохраненное в Юникс формате.
А выражение (24*60*60) - даже школьнику понятно, что это сутки.
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Всё, что мы пытаемся вам объяснить - это то, что чтобы код мог кому бы то ни было пригодиться нужно не только, чтоб он правильно работал для конкретных исходных данных, но и было понятно что делает каждая строка. Причём не так, чтоб вот тут изменил, вот тут исправил, вот тут проверил, а не является ли "1281398400" - 10.08.2010 "//конвертацией unix в нормальный формат даты". А вот именно, чтоб каждый школьник взглянул и сразу всё понял. Чтобы тот, кто решил поправить ваш код (может, даже и вы сами через год) с 10.08.2010, например на 12.03.2011 не вычислял (вспоминал) по полчаса что, где и на что надо заменить, а исправил 1 цифру в 5 секунд. Да, от этого объём кода возрастает, но поддержка его существенно облегчается.
Это просто хороший стиль программирования.

Согласен, дискуссию можно завершать. Вы к этому всё равно придёте рано или поздно, если продолжите заниматься программированием, потому что через это проходят все. Я сам на первых порах так же пытался всё сокращать и ужимать. Но после того, как пару раз по часу разбирался в том, что сам написал полгода назад, решил, что так больше писать никогда не буду. А уж когда стал в команде работать тем более пришлось и использовать определённый формат имён переменных, и отступы, и единый формат некоторых блоков, и функции для каждого даже мизерного куска, который хотя бы 2 раза используется, и многое другое. То есть даже написать что-то непонятное и прокомментировать это недостаточно. Чаще всего толковая запись в комментариях не нуждается.
 

minority

generator randomly php
Регистрация
02.05.2010
Сообщения
443
Код Тигры, может и не делает того, что ВАМ надо, но он абсолютно понятен и логичен. И чтобы его доработать надо пару минут. Если вы знаете ПХП, конечно. А то что вы какими-то левыми вычислениями получили нужное число ещё совершенно не значит, что решение верное и вы мегапрограммист. Прежде чем хамить и предлагать учить кому-то ПХП, может сначала самому научиться?
Для начало создателю темы надо научится русскому языку и читать..
 

zoldiar

New Member
Регистрация
17.08.2010
Сообщения
8
Для начало создателю темы надо научится русскому языку и читать.
Вы еще один флудер который посты зарабатывает? Не увидил написанного по теме от вас.

Ответ на мой вопрос нужен был мне, а получилось что на вопросы отвечал я.
Я показал как решил проблему, а не учил как писать скрипты.
По теме кроме одного человека это tigra60 никто больше не писал.

Мой совет владельцу форума поставить фильтр от пустофлудеров, а то уже все форумы зафлудерастили.

Спасибо tigra60 за попытку помочь. А остальным хочу пожелать умных мыслей а то глупость из них так и прет. Учитесь отвечать по теме, а не из-за словесного поноса.
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Zoldiar - не стоит так негативно относится к критике. Те советы что вам дали правильные. Просто возможно вы еще не сталкивались со старыми проектами, где не понятен даже свой код, если вы не помните о чем суть. Поверьте моему не большому опыту, что ваше решение хоть и правильное, но тяжело подчиняется разбору из-за произвольных чисел в коде.
Но посмотрите на этот топик с другой стороны вы сами нашли решение, а это лучше чем подсказка.

Если интересно, вот мое решение:
Код:
$reg_data = '22.07.2010'; $liscence_time = '-42 day';

echo $end = strtotime($liscence_time)."<br/>";
echo (strtotime($reg_data) - $end) / (24*60*60);

// или точнее одной строкой
echo (strtotime($reg_data) - strtotime($liscence_time)) / (24*60*60);
 
Статус
Закрыто для дальнейших ответов.
Верх Низ