функция временного интервала codeigniter - PullRequest
1 голос
/ 22 декабря 2010

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

я хочу сделать это, тогда человек создаст комментарий, который должен сказать «создано 1 секунду назад», а затем 1 минуту и ​​1 час и так далее:)

Может ли кто-нибудь помочь мне с этим?

спасибо

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Это в основном человекочитаемый формат, и его можно заполнить математическими проверками, чтобы проверить расстояние, рабочий фрагмент ниже:

function RelativeTime($timestamp)
{
    $difference = time() - $timestamp;
    $periods = array("sec", "min", "hour", "day", "week", "month", "years", "decade");
    $lengths = array("60","60","24","7","4.35","12","10");

    if ($difference > 0)
    {
        $ending = "ago";
    }
    else
    {
         $difference = -$difference;
         $ending = "to go";
    }

    for($j = 0; $difference >= $lengths[$j]; $j++)
    {
        $difference /= $lengths[$j];
    }

    $difference = round($difference);

    if($difference != 1)
    {
         $periods[$j].= "s";
    }
    return $difference . $periods[$j] . $ending;
}

Это будет делать будущие временные метки, такие как 12 days to go, а также временные меткинапример, 12 days ago

Надеюсь, это поможет.

Оригинальный источник: http://blog.evandavey.com/2008/04/php-date-in-human-readable-form-facebook-style.html

1 голос
/ 22 декабря 2010

Я думаю, это именно то, что вы хотите. При использовании функции установите для параметра $ deep значение 1.

function timespan($seconds = 1, $time = '', $deep = NULL)
{
    $CI = & get_instance();
    $CI->lang->load('date');
    $current_deep = 0;
    if (!is_numeric($seconds))
    {
        $seconds = 1;
    }

    if (!is_numeric($time))
    {
        $time = time();
    }

    if ($time <= $seconds)
    {
        $seconds = 1;
    }
    else
    {
        $seconds = $time - $seconds;
    }

    $str = '';
    $years = floor($seconds / 31536000);

    if ($years > 0)
    {
        $str .= $years . ' ' . $CI->lang->line((($years > 1) ? 'date_years' : 'date_year')) . ', ';
        if (++$current_deep == $deep)
            return substr(trim($str), 0, -1);
    }

    $seconds -= $years * 31536000;
    $months = floor($seconds / 2628000);

    if ($years > 0 OR $months > 0)
    {
        if ($months > 0)
        {
            $str .= $months . ' ' . $CI->lang->line((($months > 1) ? 'date_months' : 'date_month')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $months * 2628000;
    }

    $weeks = floor($seconds / 604800);

    if ($years > 0 OR $months > 0 OR $weeks > 0)
    {
        if ($weeks > 0)
        {
            $str .= $weeks . ' ' . $CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $weeks * 604800;
    }

    $days = floor($seconds / 86400);

    if ($months > 0 OR $weeks > 0 OR $days > 0)
    {
        if ($days > 0)
        {
            $str .= $days . ' ' . $CI->lang->line((($days > 1) ? 'date_days' : 'date_day')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $days * 86400;
    }

    $hours = floor($seconds / 3600);

    if ($days > 0 OR $hours > 0)
    {
        if ($hours > 0)
        {
            $str .= $hours . ' ' . $CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $hours * 3600;
    }

    $minutes = floor($seconds / 60);

    if ($days > 0 OR $hours > 0 OR $minutes > 0)
    {
        if ($minutes > 0)
        {
            $str .= $minutes . ' ' . $CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $minutes * 60;
    }

    if ($str == '')
    {
        $str .= $seconds . ' ' . $CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')) . ', ';
    }

    return substr(trim($str), 0, -1);
}

Источник

0 голосов
/ 22 декабря 2010

Если у вас есть разница $now - $creation_time в секундах, способ сделать это - разделить ее на X секунд (1 минута = 60, 1 час = 3600, 1 день = 86400), начиная с наибольшего числа, чтобы увидеть, как многие из этих юнитов соответствуют вашему времени создания, затем используйте оставшуюся часть, чтобы попытаться вписать меньшие юниты.

$diffSeconds = time() - $creation_time ;

$numDays = $diffSeconds / 86400 ;
$remainderDaySeconds = $diffSeconds % 86400 ;

$numHours = $remainderDaySeconds / 3600 ; 
$remainderSeconds = $remainderDaySeconds % 3600 ;

Оператор по модулю % даст вам остаток от деления. Таким образом, если сообщение было создано менее суток назад, то $numDays равно 0, а $remainderDaySeconds равно $diffSeconds, так что вы можете проверить и распечатать соответственно.

Редактировать Мне стало любопытно, и я заглянул в СЦ, оказывается, есть довольно много вопросов, которые расширяют этот вопрос. Связывание некоторых:

Рассчитать относительное время в C # вычисление и отображение даты в виде «секунды назад», «минуты назад», «часы назад» и т. Д. , что указывает на http://www.php.net/manual/en/function.time.php#89415

...