2012-07-17 45 views
-1

我有一個待辦事項列表應用程序正在處理。它顯示創建待辦事項時的時間戳,甚至允許用戶選擇格式應該是什麼。時間戳記爲「X天之前」,無法正確修改腳本

在這個片段中,該代碼抓住信息從MySQL數據庫,以瞭解如何格式化日期:

public function __toString(){ 
    // The string we return is outputted by the echo statement 

    if ($this->data['date_created'] == '') { 
     $date_created = date($GLOBALS["config"]["date_format"].' '.$GLOBALS["config"]["time_format"]); 
    } 
    else 
     $date_created = date($GLOBALS["config"]["date_format"].' '.$GLOBALS["config"]["time_format"], strtotime($this->data['date_created'])); 

我(這是一個從一排稱爲DATE_FORMAT和行稱爲TIME_FORMAT拉) 「M試圖執行這些代碼:

function relativeTime($dt,$precision=2) { 
    if(is_string($dt)) $dt = strtotime($dt); 

    $times=array( 365*24*60*60 => "year", 
        30*24*60*60  => "month", 
        7*24*60*60  => "week", 
        24*60*60  => "day", 
        60*60   => "hour", 
        60    => "minute", 
        1    => "second"); 

    $passed=time()-$dt; 

    if($passed<5) 
    { 
     $output='less than 5 seconds ago'; 
    } 
    else 
    { 
     $output=array(); 
     $exit=0; 

     foreach($times as $period=>$name) 
     { 
      if($exit>=$precision || ($exit>0 && $period<60)) break; 

      $result = floor($passed/$period); 
      if($result>0) 
      { 
       $output[]=$result.' '.$name.($result==1?'':'s'); 
       $passed-=$result*$period; 
       $exit++; 
      } 
      else if($exit>0) $exit++; 
     } 

     $output=implode(' and ',$output).' ago'; 
    } 

    return $output; 
} 

$date_created更換$dt和嘗試不同的組合技,但我似乎無法得到它的權利。我有一個前端錯誤告訴我relativetime是未定義的(它沒有在錯誤消息中說relativeTime,它有一個小寫的「t」)。我能做些什麼來讓$date_created以「日前」格式顯示?謝謝!

+0

你能提供一段代碼,你在哪裏調用relativeTime函數嗎?它是不是偶然地在某個班內被封裝? – heximal 2012-07-17 07:40:12

回答

1

我想改寫這個完全是這樣的:

$times = array(365*24*60*60 => "year", 
       30*24*60*60  => "month", 
       7*24*60*60  => "week", 
       24*60*60  => "day", 
       60*60   => "hour", 
       60    => "minute", 
       1    => "second"); 

$passed = time() - $dt; 

if ($passed < 5) { 
    echo "Less than 5 seconds ago."; 
} else { 
    foreach ($times as $period => $name) { 
     if ($passed >= $period) { 
      echo round($passed/$period) . " " . $name . "(s) ago"; 
      break; 
     } 
    } 
} 

請參閱此鏈接的例子(我硬編碼的$passed值用於測試目的,您可以編輯值,看看它是如何影響事情):

http://ideone.com/e8KXK


順便說一句,我已經意識到我想你的原廠l解決方案試圖完全考慮已經過去的每一秒。從用戶體驗的角度來看,這是一個壞主意。我不認爲很多用戶會希望看到「創建1年7個月19天,4小時36分28秒」,這是您的原始代碼拍攝的結果類型。這個答案只會顯示最大的單位。

+0

非常感謝您的回覆!這是我想如何調用relativeTime: 'if($ this-> data ['date_completed'] ==''){ $ date_completed =''; 返回 '

  • 數據[ 'ID'] '」 類= 「項目」>' \t \t \t \t \t \t .ToDo :: showdate相似($ GLOBALS [「 show_item_date「],$這 - >數據)。' \t \t \t \t \t \t
    '.$this->data['text'].'
    \t \t \t \t \t \t
    '.$this->data['description'].'
    \t \t \t \t \t \t
    '.relativeTime($row['date_created']).'
    \t \t \t \t \t \t
    '.$date_created.'
    \t \t \t \t \t \t
    '.$date_completed.'
    \t \t \t \t \t
  • 「; \t \t}' – 2012-07-17 13:55:37

    +0

    好吧,現在只是歸結爲我缺乏數學技能。我改變了你的代碼,這樣$ passed = time() - $ date_completed; 然後,我改變它,所以如果($通過> = $期){ $ date_launched =($通過/ $期)。 「」。 $名稱。 「(s)ago」; 休息; 並且結果是42.5714872527年 不確定我在做什麼來弄亂方程? } – 2012-07-17 14:14:23

    +0

    '$ date_completed'的值是什麼? (請注意,這是一個小數,因爲你已經去掉了調用'round()') – 2012-07-17 16:43:49

    0

    將此功能用於將來或通過日期的日期。

    function relativeTime($dt,$precision=2) { 
         if(is_string($dt)) $dt = strtotime($dt); 
         $times = array(365*24*60*60 => "year", 
            30*24*60*60  => "month", 
            7*24*60*60  => "week", 
            24*60*60  => "day", 
            60*60   => "hour", 
            60    => "minute", 
            1    => "second"); 
    
         $passed = abs(time() - $dt); 
    
         if ($passed < 5) { 
          echo "Less than 5 seconds ago."; 
         } else { 
          foreach ($times as $period => $name) { 
           if ($passed >= $period) { 
            $value = round($passed/$period); 
            $nameReal = $name; 
            if($value != 1) $nameReal .= "s"; 
    
            if(time() > $dt) 
             echo $value . " " . $nameReal . " ago"; 
            else 
             echo "In ". $value . " " . $nameReal; 
            break; 
           } 
          } 
         } 
        }