xdebugによるrelativeTime 関数が大好きです。問題は、ある程度の粒度が必要だったことです。
言い換えれば、私が決めたら数秒または数分で停止します。だから今、
echo fTime(strtotime('-23 hours 5 minutes 55 seconds'),0);
示すだろう、
23時間5分前
それ以外の
23時間5分55秒前
また、より高い時間量のいずれかに達した場合に、配列内でそれが下がらないようにしたかったのです。したがって、年を表示する場合は、年と月のみを表示したいと思います。だから今、
echo fTime(strtotime('-1 year 2 months 3 weeks 4 days 16 hours 15 minutes 22 seconds'),0);
示すだろう
1年2ヶ月前
それ以外の
1年2ヶ月3週間4日16時間15分22秒前
次のコード変更は、必要なことを行いました。もちろん、小道具は最初にxdebugに行きます。うまくいけば、他の誰かが役に立つと思うかもしれません:
function fTime($time, $gran=-1) {
$d[0] = array(1,"second");
$d[1] = array(60,"minute");
$d[2] = array(3600,"hour");
$d[3] = array(86400,"day");
$d[4] = array(604800,"week");
$d[5] = array(2592000,"month");
$d[6] = array(31104000,"year");
$w = array();
$return = "";
$now = time();
$diff = ($now-$time);
$secondsLeft = $diff;
$stopat = 0;
for($i=6;$i>$gran;$i--)
{
$w[$i] = intval($secondsLeft/$d[$i][0]);
$secondsLeft -= ($w[$i]*$d[$i][0]);
if($w[$i]!=0)
{
$return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." ";
switch ($i) {
case 6: // shows years and months
if ($stopat==0) { $stopat=5; }
break;
case 5: // shows months and weeks
if ($stopat==0) { $stopat=4; }
break;
case 4: // shows weeks and days
if ($stopat==0) { $stopat=3; }
break;
case 3: // shows days and hours
if ($stopat==0) { $stopat=2; }
break;
case 2: // shows hours and minutes
if ($stopat==0) { $stopat=1; }
break;
case 1: // shows minutes and seconds if granularity is not set higher
break;
}
if ($i===$stopat) { break 0; }
}
}
$return .= ($diff>0)?"ago":"left";
return $return;
}
マーカス