Простой вопрос - как поменять отображение даты на чтото типа “час назад”?

cardsmoney

Новичок
Простой вопрос - как поменять отображение даты на чтото типа “час назад”?

Всем привет - у меня протой вопрос!
только скажите – а как выводить не дату публикации , а скажем “1 минуту назад”, или “час назад”??
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
написать код, определяющий интервал
в чем конкретно проблема?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
cardsmoney
У тебя есть дата публикации. У тебя есть функция time(). Надеюсь ты сумеешь отнять от того, что дает функция time() дату публикации и посчитать сколько там секунд-минут-часов?...
 

soines

Новичок
Да какую статейку? Почему все думают что на все вопросы есть не только примеры но и целые статьи.c0dex же ответил тебе, что у тебя есть дата публикации неважно в timestamp или datetime, берешь текущее время, отнимаешь из текущего время публикации и исходя из дельты пишешь что прошла минута, час, год или то что тебе нужно.

Функции для работы со временем: http://ru2.php.net/manual/en/ref.datetime.php
 

Lightning

Трудоголик
Это вообще вопрос по теории программирования, а не по PHP.
 

Духовность™

Продвинутый новичок
от нечего делать написал такую функцию, не знаю, правильно нет..

PHP:
// 30 апреля 2009, 17 часов 38 минут 0 секунд
$date =  mktime(17, 38, 0, 4, 30, 2009);

get_time($date);

function get_time($date, $now=null)
{
    if ($now === null)
    {
        $now = time();
    }

    // разница между текущим временем
    // и датой $date
    $sum = $now - $date;

    $ar = array('дней'=>60*60*24, 'часов'=>60*60, 'минут' => 60, 'секунд' => 1);

    foreach ($ar as $k => $v)
    {
        echo "количество $k: ".($count = floor($sum/$v)).'<br>';

        $n = $count*$v;

        if ($n)
        {
            $sum = $sum%($n);
        }
    }
}
 

dimagolov

Новичок
triumvirat, про переводы времени, добавочные секунды ты успешно забыл.
 

Духовность™

Продвинутый новичок
dimagolov
ага, а ещё високосные года и прочая фигня. понапридумают же фсяких сложностей ;(
 

Вурдалак

Продвинутый новичок
К вопросу о реализации diff date:
PHP:
function diffDates($uts1, $uts2)
{
	if( $uts1 < $uts2 ) {
		list( $uts1, $uts2 ) = array( $uts2, $uts1 );
    }

	$date1 = date('YmdHis', $uts1);
	$date2 = date('YmdHis', $uts2);

	$diff = array
    (

		'years'   => 0,
		'months'  => 0,
		'days'    => 0,
		'hours'   => 0,
		'minutes' => 0,
        'seconds' => 0,

	);

    // seconds
    if( substr($date1, 12) < substr($date2, 12) ) {
        $diff['seconds'] = substr($date1, 12) + 60 - substr($date2, 12);
        $diff['minutes']--;
    } else {
        $diff['seconds'] = substr($date1, 12) - substr($date2, 12);
    }

    // minutes
    if( substr($date1, 10) < substr($date2, 10) ) {
        $diff['minutes'] += substr($date1, 10, 2) + 60 - substr($date2, 10, 2);
        $diff['hours']--;
    } else {
        $diff['minutes'] += substr($date1, 10, 2) - substr($date2, 10, 2);
    }

    // hours
    if( substr($date1, 8) < substr($date2, 8) ) {
        $diff['hours'] += substr($date1, 8, 2) + 24 - substr($date2, 8, 2);
        $diff['days']--;
    } else {
        $diff['hours'] += substr($date1, 8, 2) - substr($date2, 8, 2);
    }

    // days
    if( substr($date1, 6) < substr($date2, 6) ) {
        $daysInMonth = array(31, date('L', $uts2) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $diff['days'] += substr($date1, 6, 2) + $daysInMonth[(int) substr($date2, 4, 2)] - substr($date2, 6, 2);
        $diff['months']--;
    } else {
        $diff['days'] += substr($date1, 6, 2) - substr($date2, 6, 2);
    }

    // months
    if( substr($date1, 4) < substr($date2, 4) ) {
        $diff['months'] += substr($date1, 4, 2) + 12 - substr($date2, 4, 2);
        $diff['years']--;
    } else {
        $diff['months'] += substr($date1, 4, 2) - substr($date2, 4, 2);
    }

    // years
    $diff['years'] += substr($date1, 0, 4) - substr($date2, 0, 4);

	return $diff;
}
— я сделал аналог вычисления «в столбик».
 

cardsmoney

Новичок
помогите тогде ненмного работраться к кодом

вот он.


PHP:
<?php
function compare_dates($date1, $date2 = time())
    {
    $blocks = array(
        array('name'=>'year','amount'    =>    60*60*24*365    ),
        array('name'=>'month','amount'    =>    60*60*24*31    ),
        array('name'=>'week','amount'    =>    60*60*24*7    ),
        array('name'=>'day','amount'    =>    60*60*24    ),
        array('name'=>'hour','amount'    =>    60*60        ),
        array('name'=>'minute','amount'    =>    60        ),
        array('name'=>'second','amount'    =>    1        )
        );
   
    $diff = abs($date1-$date2);
   
    $levels = 2;
    $current_level = 1;
    $result = array();
    foreach($blocks as $block)
        {
        if ($current_level > $levels) {break;}
        if ($diff/$block['amount'] >= 1)
            {
            $amount = floor($diff/$block['amount']);
            if ($amount>1) {$plural='s';} else {$plural='';}
            $result[] = $amount.' '.$block['name'].$plural;
            $diff -= $amount*$block['amount'];
            $current_level++;
            }
        }
    return implode(' ',$result).' ago';
    }
?>
короче говоря, вобщем-то понятно, но я непонимаю смысла трёх строк
$current_level = 1; - что это?
$diff -= $amount*$block['amount']; непонимаю смысла
$current_level++; - зачем?
 

WebAngel

Новичок
PHP:
$diff -= $amount*$block['amount'];
отнимается вычисленное целое значение (года, месяца, дня и тд),
например, было 35 536 060 сек, это
PHP:
$amount = floor($diff/$block['amount']);
для

array('name'=>'year','amount' => 60*60*24*365 ),

нам вычислняет, что у нас один целый год
35 536 060 сек - это 1 год (31 536 000 сек)
и следовательно:
PHP:
$diff -= $amount*$block['amount'];
35 536 060 - 31 536 000 = 4 000 000 сек
$diff равняется 4 000 000 сек, ну и дальше по циклу вычисляем сколько целых месяцев и тд.

а это
$levels = 2;
$current_level = 1;
if ($current_level > $levels) {break;}
$current_level++;

задает с какой точностью выводить результат.
 

cardsmoney

Новичок
$diff -= $amount*$block['amount'];


мне просто непонятго - судя по вашим комментариям, это строка равна просто числу 4000000 и всё,

как будто

PHP:
  $result[] = $amount.' '.$block['name'].$plural;
            4 000 000;
            $current_level++;
ну так а вопрос в том какой смысл этого выражения???
 

soines

Новичок
cardsmoney, да то, что diff с каждой итерацией цикла уменьшается, чтобы вычислить год, месяц и т.д..

-~{}~ 07.05.10 15:40:

Только лучше не пользоваться этой функцией..
 
Сверху