【问题标题】:Show x time ago if time is less than 24 hour ago如果时间少于 24 小时前,则显示 x 时间前
【发布时间】:2012-08-22 23:54:18
【问题描述】:

我使用 Codeigniter,它具有以 1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes 形式返回时间的 timespan() 函数。

如果时间在过去 24 小时内,我只想显示 x 小时前格式化的时间,否则只显示正常的日期时间。

我觉得必须有一个函数可以做到这一点,但我没有找到它。

这是 Codeigniter 包含的时间跨度函数,我该如何更改它?

/**
 * Timespan
 *
 * Returns a span of seconds in this format:
 *  10 days 14 hours 36 minutes 47 seconds
 *
 * @access  public
 * @param   integer a number of seconds
 * @param   integer Unix timestamp
 * @return  integer
 */
if ( ! function_exists('timespan'))
{
    function timespan($seconds = 1, $time = '')
    {
        $CI =& get_instance();
        $CI->lang->load('date');

        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')).', ';
        }

        $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')).', ';
            }

            $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')).', ';
            }

            $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')).', ';
            }

            $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')).', ';
            }

            $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')).', ';
            }

            $seconds -= $minutes * 60;
        }

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

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

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    此函数将接受字符串、数字(unix)时间戳或DateTime 对象。它还接受jQuery.now()。时间可能在未来或过去。

    function time_ago($time=false, $just_now=false) {
        if ($time instanceOf DateTime)
            $time = $time->getTimestamp();
        elseif (is_numeric($time))
            $time = date('m/d/y h:i A', $time);
        if (strtotime($time) === false)
            $time = date('m/d/y h:i A', time());
        $interval =  date_create($time)->diff(date_create('now'));
        $adjective = strtotime($time) > time() ? 'from now' : 'ago';
        return (
            $interval->days > 0 ? 
                $time : (
                    $interval->h < 1  && $interval->i < 1 && $just_now ? 
                        'just now' : 
                        (
                            $interval->h > 1 ? 
                                $interval->h.' hour'.(
                                    $interval->h > 1 ? 
                                        's' : 
                                        ''
                                ).' ago' : 
                                $interval->i.' minutes'.' '.$adjective
                        )
                )
        );
    }
    
    
    echo time_ago('8/22/2012 5:00 PM'); // 3 hours ago
    echo time_ago('8/21/2012 5:00 PM'); // 8/21/2012 5:00 PM
    echo time_ago(time()); // 0 hours ago
    echo time_ago(time(), true); // just now
    echo time_ago(strtotime('5 days ago')); // 08/17/12 08:18 PM
    echo time_ago(strtotime('5 hours ago')); // 5 hours ago
    echo time_ago(strtotime('5 minutes ago')); // 5 minutes ago
    echo time_ago(strtotime('+5 minutes')); // 5 minutes from now
    
    echo time_ago('jQuery.now()', true); // just now
    echo time_ago('sweet explosions, bro!', true); // just now
    

    文档

    【讨论】:

    • @Lusitanian 我的一个严重的、糟糕的实践遗漏,我已经纠正了。谢谢你帮助我成为一个更好的程序员。
    • 优秀。我现在认输了。
    【解决方案2】:
    if( time() - $yourTime <= 86400 ) {  // 86400 seconds in a day
        echo timespan($yourTime);
    } else { 
       echo date('m/d/Y \a\t H:i:s', $yourTime);
    }
    

    不要依赖任何框架,尤其是糟糕的框架!

    【讨论】:

      【解决方案3】:

      使用 $format 来满足您的需求。几乎可以接受任何输入。

      <?php
      
      /**
       * RelativeTime - pretty printed
       * @author Dejan Marjanovic
       */
      class Site5_RelativeTime
      {
      
          private $interval = '';
      
          public function __construct()
          {
              call_user_func_array(array($this, 'calculate'), func_get_args());
          }
      
          public function calculate($start, $end = NULL)
          {
      
              if ( empty($start))
                  return false;
      
              if (empty($end))
                  $end = time();
      
              if ( ! is_numeric($start))
                  $start = strtotime($start);
      
              if ( ! is_numeric($end))
                  $end = strtotime($end);        
      
              if($start > $end)
                  $future = TRUE;
      
              $start = '@' . $start;
              $end = '@' . $end;
      
              if ( ! ($start instanceof DateTime))
                  $start = new DateTime($start);
      
              if ($end === null)
                  $end = new DateTime();
      
              if ( ! ($end instanceof DateTime))
                  $end = new DateTime($end);
      
              $interval = $end->diff($start);
      
              $get_plural = function($int, $str)
              {
                  return $int > 1? $str.'s': $str;
              };
      
              $format = array();
      
              if ($interval->y !== 0)
                  $format[] = "%y " . $get_plural($interval->y, "year");
              if ($interval->m !== 0)
                  $format[] = "%m " . $get_plural($interval->m, "month");
              if ($interval->d !== 0)
                  $format[] = "%d " . $get_plural($interval->d, "day");
              if ($interval->h !== 0)
                  $format[] = "%h " . $get_plural($interval->h, "hour");
              if ($interval->i !== 0)
                  $format[] = "%i " . $get_plural($interval->i, "minute");
      
      
              if ($interval->s !== 0)
              {
                  if ( ! count($format))
                  {
                      $this->interval = "less than a minute";
                      return;
                  }
                  else
                  {
                      $format[] = "%s " . $get_plural($interval->s, "second");
                  }
              }
      
              if (count($format) > 1)
              {
                  $format = array_shift($format) . " and " . array_shift($format);
              }
              else
              {
                  $format = array_pop($format);
              }
      
              $tense = ($future === TRUE)? 'from now': 'ago';
      
              $this->interval = $interval->format($format) . ' ' . $tense;
          }
      
          public function __toString()
          {
              return $this->interval;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多