在 PHP 代码点火器中显示"time ago"而不是日期时间



我想显示类似twitter和FB的时间格式(发布于3小时前,发布于2分钟前,依此类推…)

我尝试过这段代码,但没有成功:

function format_interval($timestamp, $granularity = 2) {
  $units = array('1 year|@count years' => 31536000, '1 week|@count weeks' => 604800, '1 day|@count days' => 86400, '1 hour|@count hours' => 3600, '1 min|@count min' => 60, '1 sec|@count sec' => 1);
  $output = '';
  foreach ($units as $key => $value) {
    $key = explode('|', $key);
    if ($timestamp >= $value) {
      $floor = floor($timestamp / $value);
      $output .= ($output ? ' ' : '') . ($floor == 1 ? $key[0] : str_replace('@count', $floor, $key[1]));
      $timestamp %= $value;
      $granularity--;
    }
    if ($granularity == 0) {
      break;
    }
}

我使用这个函数并回调到另一个函数中,比如:$this->format_interval();并将其传递给我的View

我当前的格式日期是:2012-07-26 09:31:pm并且已经存储在我的数据库中

任何帮助都将不胜感激!

Date Helper的timespan()方法就是这样做的:

此函数最常见的用途是显示从过去某个时间点到现在经过了多少时间。

给定时间戳,它将以以下格式显示经过的时间:

1年10个月2周5天10小时16分钟

因此,在您的示例中,您所需要做的就是将日期转换为时间戳,然后执行以下操作:

$post_date = '13436714242';
$now = time();
// will echo "2 hours ago" (at the time of this post)
echo timespan($post_date, $now) . ' ago';

my_date_helper.php文件中尝试这样的操作(来源:Codeigniter Forums):

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
if( ! function_exists('relative_time'))
{
    function relative_time($datetime)
    {
        $CI =& get_instance();
        $CI->lang->load('date');
        if(!is_numeric($datetime))
        {
            $val = explode(" ",$datetime);
           $date = explode("-",$val[0]);
           $time = explode(":",$val[1]);
           $datetime = mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
        }
        $difference = time() - $datetime;
        $periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
        $lengths = array("60","60","24","7","4.35","12","10");
        if ($difference > 0) 
        { 
            $ending = $CI->lang->line('date_ago');
        } 
        else 
        { 
            $difference = -$difference;
            $ending = $CI->lang->line('date_to_go');
        }
        for($j = 0; $difference >= $lengths[$j]; $j++)
        {
            $difference /= $lengths[$j];
        } 
        $difference = round($difference);
        if($difference != 1) 
        { 
            $period = strtolower($CI->lang->line('date_'.$periods[$j].'s'));
        } else {
            $period = strtolower($CI->lang->line('date_'.$periods[$j]));
        }
        return "$difference $period $ending";
    }

} 

该格式与您在数据库中使用的格式有点不同(为什么要用下午/上午标记时间,而不是只使用24小时时间并转换为前端?)。无论哪种方式,都不应该花太多的工作来让它发挥作用。

我有一个函数解决了这个问题:

$int_diff       =   (time() - $int_time);
$str_this_year  =   date('Y-01-01', $int_time);
$str_weekday    =   t('time_weekday_'.strtolower(date('l', $int_time)));
$str_month      =   t('time_month_'.strtolower(date('F', $int_time)));
$arr_time_formats   =   array(  '-90 seconds'   =>  t('time_a_minute_at_most'),
                                '-45 minutes'   =>  t('time_minutes_ago', ceil($int_diff / (60))),
                                '-70 minutes'   =>  t('time_an_hour_at_most'),
                                '-8 hours'      =>  t('time_hours_ago', ceil($int_diff / (60 * 60))),
                                'today'         =>  t('time_hours_ago', ceil($int_diff / (60 * 60))),
                                'yesterday'     =>  t('time_yesterday', date('H:i', $int_time)),
                                '-4 days'       =>  t('time_week_ago', $str_weekday, date('H:i', $int_time)),
                                $str_this_year  =>  t('time_date', date('j', $int_time), $str_month, date('H:i', $int_time)),
                                0               =>  t('time_date_year', date('j', $int_time), $str_month, date('Y', $int_time), date('H:i', $int_time)));
if ($boo_whole)
    return $arr_time_formats[0];
foreach(array_keys($arr_time_formats) as $h)
    if ($int_time >= strtotime($h))
        return $arr_time_formats[$h];

基本上CCD_ 3是与CCD_ 4和CCD_。这里的想法是给出通过strtotime()运行的密钥,直到您到达最近的时间,0是回退。

这种方法真的很好,因为你可以通过一个很好的概述来轻松调整时间。我可以给出更多的代码,但这感觉做了太多的工作:)基本上,这只是你如何做到这一点的理论

<?php 
    $this->load->helper('date');
    //client created date get from database
    $date=$client_list->created_date; 
    // Declare timestamps
    $last = new DateTime($date);
    $now = new DateTime( date( 'Y-m-d h:i:s', time() )) ; 
    // Find difference
    $interval = $last->diff($now);
    // Store in variable to be used for calculation etc
    $years = (int)$interval->format('%Y');
    $months = (int)$interval->format('%m');
    $days = (int)$interval->format('%d');
    $hours = (int)$interval->format('%H');
    $minutes = (int)$interval->format('%i');
                                 //   $now = date('Y-m-d H:i:s');

                                 if($years > 0)
                                 {
                                 echo $years.' Years '.$months.' Months '.$days.' Days '. $hours.' Hours '.$minutes.' minutes ago.' ;
                                 }
                                 else if($months > 0)
                                 {
                                 echo $months.' Months '.$days.' Days '. $hours.' Hours '.$minutes.' minutes ago.' ;
                                 }
                                 else if($days > 0)
                                 {
                                 echo $days.' Days '.$hours.' Hours '.$minutes.' minutes ago.' ;
                                 }
                                 else if($hours > 0)
                                 {
                                 echo  $hours.' Hours '.$minutes.' minutes ago.' ;
                                 }
                                 else
                                 {
                                 echo $minutes.' minutes ago.' ;
                                 }

                                 ?>

最新更新