2012-01-23 93 views
0

我們基於CodeIgniter的網站有一個部分顯示用戶最後一次登錄時間(必要時使用天數和小時,分鐘,秒) 。我試圖在結果爲1天時打印「天」,並在1天內打印「天」。目前1天顯示爲1 day,但2天(及以上)顯示爲2 day 2 days。你能看到我在這裏做錯了什麼,並修改了代碼嗎?「最後一次登錄:」 - 當登錄時間超過一天前打印「天數」

$dDf =天

$hDf =小時

$mDf =分鐘

$sDf =第二

<?php 
    if ($dDf < 1) { 
     if ($hDf > 0) { 
      if ($mDf < 0) { 
       $mDf = 60 + $mDf; 
       $hDf = $hDf - 1; 
       echo $mDf . ' min'; 
      } else { 
       echo $hDf . ' hr ' . $mDf . ' min'; 
      } 
     } else { 
      if ($mDf > 0) { 
       echo $mDf . ' min ' . $sDf . ' sec'; 
      } else { 
       echo $sDf . ' sec'; 
      } 
     } 
    } else { 
     echo $dDf . ' days '; 

     if ($dDf > 1) { 
      if ($hDf > 0) { 
       if ($mDf < 0) { 
        $mDf = 60 + $mDf; 
        $hDf = $hDf - 1; 
        echo $mDf . ' min'; 
       } else { 
        echo $hDf . ' hr ' . $mDf . ' min'; 
       } 
      } else { 
       if ($mDf > 0) { 
        echo $mDf . ' min ' . $sDf . ' sec'; 
       } else { 
        echo $sDf . ' sec'; 
       } 
      } 
     } else { 
      echo $dDf . ' day '; 

      if ($hDf > 0) { 
       if ($mDf < 0) { 
        $mDf = 60 + $mDf; 
        $hDf = $hDf - 1; 
        echo $mDf . ' min'; 
       } else { 
        echo $hDf . ' hr ' . $mDf . ' min'; 
       } 
      } else { 
       if ($mDf > 0) { 
        echo $mDf . ' min ' . $sDf . ' sec'; 
       } else { 
        echo $sDf . ' sec'; 
       } 
      } 
     } 


    } 
?> 
+7

哇,誰來解碼模糊變量?只是一個提示,變量名稱的冗長可以走很長的路。 –

+0

我猜''mDf'是分鐘等? -_- –

+0

你是對的 - 我應該寫出可變的標題,對此感到抱歉。 '$ dDf' = day(這是唯一與此問題相關的) – JoeW

回答

1

有什麼理由你不希望使用內置的timespan()功能呢?

<?php 
$this->load->helper('date'); 
echo timespan($last_logged_in_timestamp); 
+0

主要原因是我們的網站實際上是捷克語,'timespan'結果是英語,但是這可能會使用MySQL日期變量進行更改。感謝您的想法! – JoeW

+1

該函數使用Language類,因此您應該能夠在語言文件中設置'date_year','date_month','date_weeks'等(及其複數等價物)。我從來不需要這樣做,但看起來並不難。 – landons

0

我在我的代碼庫的old example。它應該給你一個如何去做的想法。

function time_readable($duration) { 
    $days = floor($duration/86400); 
    $hrs = floor(($duration - $days * 86400)/3600); 
    $min = floor(($duration - $days * 86400 - $hrs * 3600)/60); 
    $s = $duration - $days * 86400 - $hrs * 3600 - $min * 60; 

    $return = ($days > 0) ? $days . ' d ' : ''; 
    $return .= ($days > 0 || $hrs > 0) ? $hrs . ' hours ' : ''; 
    $return .= ($days > 0 || $hrs > 0 || $min > 0) ? $min . ' min ' : ''; 
    $return .= ($days > 0 || $hrs > 0 || $min > 0) ? $s . ' s ' : ''; 

    return $return; 
} 
2

我打算寫的東西,但沒有持續超過60秒的一個非常簡單的谷歌搜索想出了THIS,所以你有它。裏面的代碼:

/** 
* A function for making time periods readable 
* 
* @author  Aidan Lister <[email protected]> 
* @version  2.0.1 
* @link  http://aidanlister.com/2004/04/making-time-periods-readable/ 
* @param  int  number of seconds elapsed 
* @param  string which time periods to display 
* @param  bool whether to show zero time periods 
*/ 
function time_duration($seconds, $use = null, $zeros = false) 
{ 
    // Define time periods 
    $periods = array (
     'years'  => 31556926, 
     'Months' => 2629743, 
     'weeks'  => 604800, 
     'days'  => 86400, 
     'hours'  => 3600, 
     'minutes' => 60, 
     'seconds' => 1 
     ); 

    // Break into periods 
    $seconds = (float) $seconds; 
    $segments = array(); 
    foreach ($periods as $period => $value) { 
     if ($use && strpos($use, $period[0]) === false) { 
      continue; 
     } 
     $count = floor($seconds/$value); 
     if ($count == 0 && !$zeros) { 
      continue; 
     } 
     $segments[strtolower($period)] = $count; 
     $seconds = $seconds % $value; 
    } 

    // Build the string 
    $string = array(); 
    foreach ($segments as $key => $value) { 
     $segment_name = substr($key, 0, -1); 
     $segment = $value . ' ' . $segment_name; 
     if ($value != 1) { 
      $segment .= 's'; 
     } 
     $string[] = $segment; 
    } 

    return implode(', ', $string); 
}