За последние 24 часа нас посетили 19028 программистов и 1627 роботов. Сейчас ищут 913 программистов ...

Помогите исправить подсчет оставшихся лет-месяцев-дней

Тема в разделе "PHP для новичков", создана пользователем Front, 3 апр 2008.

  1. Front

    Front Активный пользователь

    С нами с:
    3 апр 2008
    Сообщения:
    5
    Симпатии:
    0
    Имеется вот такой скрипт линеек (это немного переделанный от metrik_Robin).
    Все работает нормально за исключением фиговины с кол-вом дней. Дело даже не в точности, думаю никто по линейкам научные наблюдения не ведет, а в ГЛЮКЕ когда наступает годовщина, например
    "...прошло уже 3 года 0 месяцев 0 дней"
    На следующий день фраза вобще не генерится, и так продолжается целых 6 дней, потом генерится:
    "...прошло уже 3 года 0 месяцев 1 день" :)
    Насколько я понял это происходит изза того что скрипт считает что в месяце 30 дней, но если разделить 365 (фиг с ними с високосными) на 12 получаем грубо 30,5 - вот за год и набегает 6 "потерявшихся" дней.

    Вопросы:
    1.Как сделать чтобы считалось правильно?
    или хотя бы
    2.Как сделать чтобы эти 6 дней генерилась например фраза "Дружно все квасим!" :D
    и еще
    3.Как сделать чтобы при вводе даты РАНЕЕ 1970го года генерилась например фраза "Бабуля, пшла атседа" :D

    В PHP как вы поняли имею оооочень поверхностные знания.

    Вот этот кусок:
    PHP:
    1.  
    2. <?php
    3. ....
    4. imagecopy($out,$line,0,$out_h-$line_sy ,0,0,$line_sx,$line_sy);
    5.  
    6. $pixpm=$line_sx/12;
    7. $std=$_GET['d'];
    8. $ed=time();
    9.  
    10. $sid=3600*24;
    11. $sim=3600*30*24;
    12.  
    13. $sty=mktime(0,0,0,0,0,date('Y',$std));
    14. $offset=abs($ed-$std);
    15. $years=floor($offset/(365*24*60*60));
    16. $offset=$offset-$years*(365*24*60*60);
    17. $monsz=floor($offset/(30*24*60*60));
    18. $offset=$offset-$monsz*(30*24*60*60);
    19. $days=floor($offset/(24*60*60));
    20.  
    21. $beg_x=$monsz*$pixpm;
    22.  
    23. imagecopy($out,$beg,$beg_x,5,0,0,$beg_sx,$beg_sy);
    24.  
    25. if ($years>0)
    26. $str_metrik=$text.' '.$years.' лет '.$monsz.' месяцев и '.$days.' дней';
    27. else
    28. $str_metrik=$text.' '.$monsz.' месяцев и '.$days.' дней';
    29.  
    30. if($beg_x<$line_sx)
    31. imagefttext($out,6,0,10,$out_h+10,imagecolorallocate($out,0,0,0),'raxel.ttf',
    32. win2uni($str_metrik));
    33.  
    34. imagefttext($out,6,0,$line_sx-87,10,imagecolorallocate($out,0,0,0),'raxel.ttf',
    35. win2uni('www.fbi.ru'));
    36.  
    37. imagepng($out);
    38.  
    39. ?>
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
  3. Anonymous

    Anonymous Guest

    0: У нас для кода есть тег PHP. Если несложно.
    1: Надо переписать формулу для подсчета дней. Это не программмирование, это математика.
    2+3+бонус:
    Вот этот кусок поменять на ээтот:
    PHP:
    1. <?php
    2. $str_metrik = $text;
    3. if (($monsz == 0) and ($days==0) ) { $str_metrik = 'Дружно квасим!'; }
    4. else {
    5.     if ($years>0) { $str_metrik.= $years. 'лет '; } 
    6.     if ($monsz>0) { $str_metrik.= $monsz. 'месяцев '; } 
    7.     if ($days>0) { $str_metrik.= $days. 'дней '; } 
    8.     }
    9. ?>
     
  4. Front

    Front Активный пользователь

    С нами с:
    3 апр 2008
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, но к сожалению для меня это очень тугопонятно.

    Угу, исправил, сорри. Ткнул Code и где-то мысль промелькнула почему не так красиво вышло как у всех тут. :)

    Спасиииибоооо!!!!
    Методом тыка понял что это оно:
    $monsz=floor($offset/(30.42*24*60*60));
    $offset=$offset-$monsz*(30.42*24*60*60);
    Теперь все правильно считает! (Ну в масштабах года конечно)

    Спасибо, работает. :)

    Олег, низкий поклон!
     
  5. Front

    Front Активный пользователь

    С нами с:
    3 апр 2008
    Сообщения:
    5
    Симпатии:
    0
    Чуть не забыл, если не сложно - а как добавить возможность ручного выбора цвета надписи?
    В этом скрипте он както сам выбирается то черный то красный.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А ты дели на 365.25 и выбирай целую часть (функция intval).
     
  7. Front

    Front Активный пользователь

    С нами с:
    3 апр 2008
    Сообщения:
    5
    Симпатии:
    0
    Угу, точно, этоже просто, раз в 4 года + 1день! Похоже что вот так правильно:
    PHP:
    1.  
    2. <?php
    3. $years=floor($offset/(365.25*24*60*60));
    4. $offset=$offset-$years*(365.25*24*60*60);
    5. $monsz=floor($offset/(30.4375*24*60*60));
    6. $offset=$offset-$monsz*(30.4375*24*60*60);
    7. $days=floor($offset/(24*60*60));
    8. ?>
    9.  
    Попробовал, вроде правильно считает.


    Только не пойму что вот это, и для чего:
    PHP:
    1. $sid=3600*24;
    2. $sim=3600*30*24;