2012-03-21 95 views
4

我正在製作通知卡。而不是顯示通知來的時間。我想顯示自通知到來以來的時間。 因爲它發生在Twitter和Facebook,他們顯示32米,1小時前等如何顯示發佈更新時間,如Facebook和Twitter?

我想實現此代碼是JavaScript/Java。

任何幫助將非常感激。

+0

你將不得不向我們展示更多一些,像你正在渲染的HTML將是一個好的開始。 – 2012-03-21 13:57:06

回答

1

從發佈時間中減去當前時間。剩餘的毫秒數可以用來格式化一個不錯的'... ago'字符串。

可以找到一些javascript時間函數here。 一些算法,我發現(PHP):

function TimeAgo($datefrom,$dateto=-1) 
{ 
    // Defaults and assume if 0 is passed in that 
    // its an error rather than the epoch 

    if($datefrom<=0) { 
     return "A long time ago"; 
    } 
    if($dateto==-1) { 
     $dateto = time(); 
    } 

    // Calculate the difference in seconds betweeen 
    // the two timestamps 

    $difference = $dateto - $datefrom; 

    // If difference is less than 60 seconds, 
    // seconds is a good interval of choice 

    if($difference < 60) 
    { 
     $interval = "s"; 
    } 

    // If difference is between 60 seconds and 
    // 60 minutes, minutes is a good interval 
    elseif($difference >= 60 && $difference<60*60) 
    { 
     $interval = "n"; 
    } 

    // If difference is between 1 hour and 24 hours 
    // hours is a good interval 
    elseif($difference >= 60*60 && $difference<60*60*24) 
    { 
     $interval = "h"; 
    } 

    // If difference is between 1 day and 7 days 
    // days is a good interval 
    elseif($difference >= 60*60*24 && $difference<60*60*24*7) 
    { 
     $interval = "d"; 
    } 

    // If difference is between 1 week and 30 days 
    // weeks is a good interval 
    elseif($difference >= 60*60*24*7 && $difference < 
    60*60*24*30) 
    { 
     $interval = "ww"; 
    } 

    // If difference is between 30 days and 365 days 
    // months is a good interval, again, the same thing 
    // applies, if the 29th February happens to exist 
    // between your 2 dates, the function will return 
    // the 'incorrect' value for a day 
    elseif($difference >= 60*60*24*30 && $difference < 
    60*60*24*365) 
    { 
     $interval = "m"; 
    } 

    // If difference is greater than or equal to 365 
    // days, return year. This will be incorrect if 
    // for example, you call the function on the 28th April 
    // 2008 passing in 29th April 2007. It will return 
    // 1 year ago when in actual fact (yawn!) not quite 
    // a year has gone by 
    elseif($difference >= 60*60*24*365) 
    { 
     $interval = "y"; 
    } 

    // Based on the interval, determine the 
    // number of units between the two dates 
    // From this point on, you would be hard 
    // pushed telling the difference between 
    // this function and DateDiff. If the $datediff 
    // returned is 1, be sure to return the singular 
    // of the unit, e.g. 'day' rather 'days' 

    switch($interval) 
    { 
     case "m": 
      $months_difference = floor($difference/60/60/24/
      29); 
      while (mktime(date("H", $datefrom), date("i", $datefrom), 
      date("s", $datefrom), date("n", $datefrom)+($months_difference), 
      date("j", $dateto), date("Y", $datefrom)) < $dateto) 
      { 
       $months_difference++; 
      } 
      $datediff = $months_difference; 

      // We need this in here because it is possible 
      // to have an 'm' interval and a months 
      // difference of 12 because we are using 29 days 
      // in a month 

      if($datediff==12) 
      { 
       $datediff--; 
      } 

      $res = ($datediff==1) ? "$datediff month ago" : "$datediff 
months ago"; 
      break; 

     case "y": 
      $datediff = floor($difference/60/60/24/365); 
      $res = ($datediff==1) ? "$datediff year ago" : "$datediff 
years ago"; 
      break; 

     case "d": 
      $datediff = floor($difference/60/60/24); 
      $res = ($datediff==1) ? "$datediff day ago" : "$datediff 
days ago"; 
      break; 

     case "ww": 
      $datediff = floor($difference/60/60/24/7); 
      $res = ($datediff==1) ? "$datediff week ago" : "$datediff 
weeks ago"; 
      break; 

     case "h": 
      $datediff = floor($difference/60/60); 
      $res = ($datediff==1) ? "$datediff hour ago" : "$datediff 
hours ago"; 
      break; 

     case "n": 
      $datediff = floor($difference/60); 
      $res = ($datediff==1) ? "$datediff minute ago" : 
"$datediff minutes ago"; 
      break; 

     case "s": 
      $datediff = $difference; 
      $res = ($datediff==1) ? "$datediff second ago" : 
"$datediff seconds ago"; 
      break; 
    } 
    return $res; 
} 
+0

有沒有這個角度版本? – kedomonzter 2014-07-25 08:02:18

+0

@gabmon:不是我所知,但今天我建議你使用[MomentJS](http://www.momentjs.com)庫。全局使用將不推薦使用,因此您可以將該lib包裝在服務中並將其注入需要的地方。 MomentJS還有一個不錯的[Twitter插件](https://github.com/hijonathan/moment.twitter),它像Twitter那樣格式化「......以前」的部分。 – 2014-08-09 15:08:12

+0

我現在有一個指令,我沒有使用MomentJS因爲它沒有更新。 – kedomonzter 2014-08-12 04:07:26

相關問題