我使用Codeigniter的「timespan()」函數給出了一段人類可讀的短語,說明自事件發生後已經過了多長時間:「5天,3小時,12分鐘,1秒」,但我不需要下到分鐘或二級。如何指定Codeigniter中timespan()函數的深度級別?
有什麼辦法可以解決這個問題嗎?
我使用Codeigniter的「timespan()」函數給出了一段人類可讀的短語,說明自事件發生後已經過了多長時間:「5天,3小時,12分鐘,1秒」,但我不需要下到分鐘或二級。如何指定Codeigniter中timespan()函數的深度級別?
有什麼辦法可以解決這個問題嗎?
簡答題:沒有。
timespan()方法不提供任何方法來定製其輸出中的細節級別。 CodeIgniter確實可以輕鬆覆蓋內置函數,以便它們按照您的喜好進行操作。
有可能是一個更優雅的解決方案(見下文),但以下是我想出的。創建一個應用程序/傭工稱爲MY_date_helper.php文件,並把下面的修改時間跨度()到它:
<?php
// Adds a third argument to timespan() that stops display of minutes/
// seconds in the final output
function timespan($seconds = 1, $time = '', $display_mins_secs = true)
{
$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;
}
// don't display minutes/seconds unless $display_mins_secs
// == true
if ($display_mins_secs)
{
$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);
}
?>
笨它將自動找到該文件,並使用你的時間跨度()函數,而不是內置版本。 this page的「擴展助手」部分提供了一些關於它如何工作的更多信息。
要利用「擴展」的入庫時間()函數,只傳遞的假第三個參數,如下所示:
$變量=時間跨度($秒,$時間,假);
有可能是一個更優雅的解決方案,也許使用PHP的本地DateTime對象(請參閱here),但從問題我認爲上述timespan()修改更貼近您的需求。
我知道這是一箇舊的線程,但我只是發現它,幾乎是我尋找的解決方案。我只是想通過數字來限制級別。我在腳本中進行了小小的修改,我將$ str作爲一個數組並添加每年,每月,每天等。然後,我遍歷數組,直到給定的限制。之後,我只是內爆一個「,」並返回結果。
也許別人也可以享受這個劇本?
<?php
// Adds a third argument to timespan() that limits the text string at given level
function timespan($seconds = 1, $time = '', $limit=null)
{
$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 = array();
$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'));
}
// Only show number of array elements depending on limit.
if($limit)
{
$i = 0;
foreach($str as $level)
{
if($i >= $limit)
unset($str[$i]);
$i++;
}
}
$return = implode(', ', $str);
return trim($return);
}
美麗。非常感謝! – Shamoon 2010-04-12 13:05:09
簡單的解決方案!使用它!謝謝! – JeroenVdb 2012-06-20 13:29:28