将时间戳转换为PHP之前的时间,例如1天前,2天前…

我想转换格式的时间戳2009-09-12 20:57:19并把它变成像3 minutes ago用PHP的东西。

我发现一个有用的脚本来做到这一点,但我认为它正在寻找一种不同的格式作为时间variables。 我想要修改这个格式的脚本是:

 function _ago($tm,$rcs = 0) { $cur_tm = time(); $dif = $cur_tm-$tm; $pds = array('second','minute','hour','day','week','month','year','decade'); $lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600); for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]); $no = floor($no); if($no <> 1) $pds[$v] .='s'; $x = sprintf("%d %s ",$no,$pds[$v]); if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm); return $x; } 

我认为在这几行脚本正在尝试做的东西看起来像这样(不同的date格式math):

 $dif = 1252809479 - 2009-09-12 20:57:19; 

我将如何将我的时间戳转换为(unix?)格式?

使用示例:

 echo time_elapsed_string('2013-05-01 00:22:35'); echo time_elapsed_string('@1367367755'); # timestamp input echo time_elapsed_string('2013-05-01 00:22:35', true); 

input可以是任何支持的date和时间格式 。

输出:

 4 months ago 4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago 

function:

 function time_elapsed_string($datetime, $full = false) { $now = new DateTime; $ago = new DateTime($datetime); $diff = $now->diff($ago); $diff->w = floor($diff->d / 7); $diff->d -= $diff->w * 7; $string = array( 'y' => 'year', 'm' => 'month', 'w' => 'week', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second', ); foreach ($string as $k => &$v) { if ($diff->$k) { $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : ''); } else { unset($string[$k]); } } if (!$full) $string = array_slice($string, 0, 1); return $string ? implode(', ', $string) . ' ago' : 'just now'; } 
 function time_elapsed_string($ptime) { $etime = time() - $ptime; if ($etime < 1) { return '0 seconds'; } $a = array( 365 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second' ); $a_plural = array( 'year' => 'years', 'month' => 'months', 'day' => 'days', 'hour' => 'hours', 'minute' => 'minutes', 'second' => 'seconds' ); foreach ($a as $secs => $str) { $d = $etime / $secs; if ($d >= 1) { $r = round($d); return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ago'; } } } 
 $time_elapsed = timeAgo($time_ago); //The argument $time_ago is in timestamp (Ymd H:i:s)format. //Function definition function timeAgo($time_ago) { $time_ago = strtotime($time_ago); $cur_time = time(); $time_elapsed = $cur_time - $time_ago; $seconds = $time_elapsed ; $minutes = round($time_elapsed / 60 ); $hours = round($time_elapsed / 3600); $days = round($time_elapsed / 86400 ); $weeks = round($time_elapsed / 604800); $months = round($time_elapsed / 2600640 ); $years = round($time_elapsed / 31207680 ); // Seconds if($seconds <= 60){ return "just now"; } //Minutes else if($minutes <=60){ if($minutes==1){ return "one minute ago"; } else{ return "$minutes minutes ago"; } } //Hours else if($hours <=24){ if($hours==1){ return "an hour ago"; }else{ return "$hours hrs ago"; } } //Days else if($days <= 7){ if($days==1){ return "yesterday"; }else{ return "$days days ago"; } } //Weeks else if($weeks <= 4.3){ if($weeks==1){ return "a week ago"; }else{ return "$weeks weeks ago"; } } //Months else if($months <=12){ if($months==1){ return "a month ago"; }else{ return "$months months ago"; } } //Years else{ if($years==1){ return "one year ago"; }else{ return "$years years ago"; } } } 

这实际上是我find的更好的解决scheme。 使用jQuery,但它完美的作品。 它也自动刷新类似于SO和Facebook的方式,所以你不必刷新页面来查看更新。

这个插件会在<time>标签中读取你的datetime attr并为你填写。

 eg "4 minutes ago" or "about 1 day ago 

http://timeago.yarp.com/

 function humanTiming ($time) { $time = time() - $time; // to get the time since that moment $time = ($time<1)? 1 : $time; $tokens = array ( 31536000 => 'year', 2592000 => 'month', 604800 => 'week', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second' ); foreach ($tokens as $unit => $text) { if ($time < $unit) continue; $numberOfUnits = floor($time / $unit); return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':''); } } echo humanTiming( strtotime($mytimestring) ); 

我做到了这一点,它工作得很好,它的工作都是像1470919932这样的unix时间戳或格式化的时间如16-08-11 14:53:30

 function timeAgo($time_ago) { $time_ago = strtotime($time_ago) ? strtotime($time_ago) : $time_ago; $time = time() - $time_ago; switch($time): // seconds case $time <= 60; return 'lessthan a minute ago'; // minutes case $time >= 60 && $time < 3600; return (round($time/60) == 1) ? 'a minute' : round($time/60).' minutes ago'; // hours case $time >= 3600 && $time < 86400; return (round($time/3600) == 1) ? 'a hour ago' : round($time/3600).' hours ago'; // days case $time >= 86400 && $time < 604800; return (round($time/86400) == 1) ? 'a day ago' : round($time/86400).' days ago'; // weeks case $time >= 604800 && $time < 2600640; return (round($time/604800) == 1) ? 'a week ago' : round($time/604800).' weeks ago'; // months case $time >= 2600640 && $time < 31207680; return (round($time/2600640) == 1) ? 'a month ago' : round($time/2600640).' months ago'; // years case $time >= 31207680; return (round($time/31207680) == 1) ? 'a year ago' : round($time/31207680).' years ago' ; endswitch; } ?> 

我修改了原来的function(在我看来更有用,或逻辑)。

 // display "X time" ago, $rcs is precision depth function time_ago ($tm, $rcs = 0) { $cur_tm = time(); $dif = $cur_tm - $tm; $pds = array('second','minute','hour','day','week','month','year','decade'); $lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600); for ($v = count($lngh) - 1; ($v >= 0) && (($no = $dif / $lngh[$v]) <= 1); $v--); if ($v < 0) $v = 0; $_tm = $cur_tm - ($dif % $lngh[$v]); $no = ($rcs ? floor($no) : round($no)); // if last denomination, round if ($no != 1) $pds[$v] .= 's'; $x = $no . ' ' . $pds[$v]; if (($rcs > 0) && ($v >= 1)) $x .= ' ' . $this->time_ago($_tm, $rcs - 1); return $x; } 

只是抛出另一种select…

虽然我更喜欢DateTime方法发布在这里 ,我不喜欢它显示0年的事实等

 /* * Returns a string stating how long ago this happened */ private function timeElapsedString($ptime){ $diff = time() - $ptime; $calc_times = array(); $timeleft = array(); // Prepare array, depending on the output we want to get. $calc_times[] = array('Year', 'Years', 31557600); $calc_times[] = array('Month', 'Months', 2592000); $calc_times[] = array('Day', 'Days', 86400); $calc_times[] = array('Hour', 'Hours', 3600); $calc_times[] = array('Minute', 'Minutes', 60); $calc_times[] = array('Second', 'Seconds', 1); foreach ($calc_times AS $timedata){ list($time_sing, $time_plur, $offset) = $timedata; if ($diff >= $offset){ $left = floor($diff / $offset); $diff -= ($left * $offset); $timeleft[] = "{$left} " . ($left == 1 ? $time_sing : $time_plur); } } return $timeleft ? (time() > $ptime ? null : '-') . implode(' ', $timeleft) : 0; } 

我不知道为什么没有人提到碳。

https://github.com/briannesbitt/Carbon

这实际上是php dateTime的扩展(已经在这里使用了),它有:diffForHumans方法。 所以你所要做的就是:

 $dt = Carbon::parse('2012-9-5 23:26:11.123789'); echo $dt->diffForHumans(); 

更多示例: http : //carbon.nesbot.com/docs/#api-humandiff

这个解决scheme的优点:

  • 它适用于未来的date,并会返回类似2个月等
  • 你可以使用本地化来获得其他语言和复数工作正常
  • 如果你将开始使用碳的其他事情与date工作将一样容易,永远不会。

我发现如下丑陋的结果:

1年,2个月,0天,0小时,53分钟和1秒

因此,我实现了一个尊重复数的函数,删除空值,并可以select缩短输出:

 function since($timestamp, $level=6) { global $lang; $date = new DateTime(); $date->setTimestamp($timestamp); $date = $date->diff(new DateTime()); // build array $since = json_decode($date->format('{"year":%y,"month":%m,"day":%d,"hour":%h,"minute":%i,"second":%s}'), true); // remove empty date values $since = array_filter($since); // output only the first x date values $since = array_slice($since, 0, $level); // build string $last_key = key(array_slice($since, -1, 1, true)); $string = ''; foreach ($since as $key => $val) { // separator if ($string) { $string .= $key != $last_key ? ', ' : ' ' . $lang['and'] . ' '; } // set plural $key .= $val > 1 ? 's' : ''; // add date value $string .= $val . ' ' . $lang[ $key ]; } return $string; } 

看起来好多了:

1年5天53分1秒

可以使用$level = 2来缩短它,如下所示:

1年零2个月

删除$lang部分,如果你只需要英文或编辑这个翻译,以满足您的需求:

 $lang = array( 'second' => 'Sekunde', 'seconds' => 'Sekunden', 'minute' => 'Minute', 'minutes' => 'Minuten', 'hour' => 'Stunde', 'hours' => 'Stunden', 'day' => 'Tag', 'days' => 'Tage', 'month' => 'Monat', 'months' => 'Monate', 'year' => 'Jahr', 'years' => 'Jahre', 'and' => 'und', ); 

我知道这里有几个答案,但这是我想出的。 这只能处理MySQL的DATETIME值根据我原来的问题回应。 数组$ a需要一些工作。 我欢迎有关如何改进的意见。 呼叫:

echo time_elapsed_string('2014-11-14 09:42:28');

 function time_elapsed_string($ptime) { // Past time as MySQL DATETIME value $ptime = strtotime($ptime); // Current time as MySQL DATETIME value $csqltime = date('Ymd H:i:s'); // Current time as Unix timestamp $ctime = strtotime($csqltime); // Elapsed time $etime = $ctime - $ptime; // If no elapsed time, return 0 if ($etime < 1){ return '0 seconds'; } $a = array( 365 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second' ); $a_plural = array( 'year' => 'years', 'month' => 'months', 'day' => 'days', 'hour' => 'hours', 'minute' => 'minutes', 'second' => 'seconds' ); foreach ($a as $secs => $str){ // Divide elapsed time by seconds $d = $etime / $secs; if ($d >= 1){ // Round to the next lowest integer $r = floor($d); // Calculate time to remove from elapsed time $rtime = $r * $secs; // Recalculate and store elapsed time for next loop if(($etime - $rtime) < 0){ $etime -= ($r - 1) * $secs; } else{ $etime -= $rtime; } // Create string to return $estring = $estring . $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' '; } } return $estring . ' ago'; } 

它帮助你检查它

  function calculate_time_span($seconds) { $year = floor($seconds /31556926); $months = floor($seconds /2629743); $week=floor($seconds /604800); $day = floor($seconds /86400); $hours = floor($seconds / 3600); $mins = floor(($seconds - ($hours*3600)) / 60); $secs = floor($seconds % 60); if($seconds < 60) $time = $secs." seconds ago"; else if($seconds < 3600 ) $time =($mins==1)?$mins."now":$mins." mins ago"; else if($seconds < 86400) $time = ($hours==1)?$hours." hour ago":$hours." hours ago"; else if($seconds < 604800) $time = ($day==1)?$day." day ago":$day." days ago"; else if($seconds < 2629743) $time = ($week==1)?$week." week ago":$week." weeks ago"; else if($seconds < 31556926) $time =($months==1)? $months." month ago":$months." months ago"; else $time = ($year==1)? $year." year ago":$year." years ago"; return $time; } $seconds = time() - strtotime($post->post_date); echo calculate_time_span($seconds); 

你将不得不把你的时间戳每个单独的一块,并将其转换成Unix时间。 例如对于时间戳,2009-09-12 20:57:19。

(((2008-1970)* 365)+(8 * 30)+12)* 24 + 20会给您1970年1月1日以来的粗略估计值。

取这个数字,乘以60,然后加57得到分钟数。

拿那个,乘以60再加19。

然而,这将转换非常粗糙和不准确。

有没有什么理由不能把正常的Unix时间作为开始?

如果使用MySQL,请使用UNIX_TIMESTAMP()函数。

从上面略微修改答案:

  $commentTime = strtotime($whatever) $today = strtotime('today'); $yesterday = strtotime('yesterday'); $todaysHours = strtotime('now') - strtotime('today'); private function timeElapsedString( $commentTime, $todaysHours, $today, $yesterday ) { $tokens = array( 31536000 => 'year', 2592000 => 'month', 604800 => 'week', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second' ); $time = time() - $commentTime; $time = ($time < 1) ? 1 : $time; if ($commentTime >= $today || $commentTime < $yesterday) { foreach ($tokens as $unit => $text) { if ($time < $unit) { continue; } if ($text == 'day') { $numberOfUnits = floor(($time - $todaysHours) / $unit) + 1; } else { $numberOfUnits = floor(($time)/ $unit); } return $numberOfUnits . ' ' . $text . (($numberOfUnits > 1) ? 's' : '') . ' ago'; } } else { return 'Yesterday'; } } 

我试过这个,对我来说工作得很好

 $datetime1 = new DateTime('2009-10-11'); $datetime2 = new DateTime('2009-10-10'); $difference = $datetime1->diff($datetime2); echo formatOutput($difference); function formatOutput($diff){ /* function to return the highrst defference fount */ if(!is_object($diff)){ return; } if($diff->y > 0){ return $diff->y .(" year".($diff->y > 1?"s":"")." ago"); } if($diff->m > 0){ return $diff->m .(" month".($diff->m > 1?"s":"")." ago"); } if($diff->d > 0){ return $diff->d .(" day".($diff->d > 1?"s":"")." ago"); } if($diff->h > 0){ return $diff->h .(" hour".($diff->h > 1?"s":"")." ago"); } if($diff->i > 0){ return $diff->i .(" minute".($diff->i > 1?"s":"")." ago"); } if($diff->s > 0){ return $diff->s .(" second".($diff->s > 1?"s":"")." ago"); } } 

在这里查看这个链接以供参考

谢谢! 玩得开心。

检查这个函数intval() – http://php.net/manual/en/function.intval.php下面的代码可能会帮助你:;

 $seconds_ago = (time() - strtotime('2014-01-06 15:25:08')); if ($seconds_ago >= 31536000) { echo "Seen " . intval($seconds_ago / 31536000) . " years ago"; } elseif ($seconds_ago >= 2419200) { echo "Seen " . intval($seconds_ago / 2419200) . " months ago"; } elseif ($seconds_ago >= 86400) { echo "Seen " . intval($seconds_ago / 86400) . " days ago"; } elseif ($seconds_ago >= 3600) { echo "Seen " . intval($seconds_ago / 3600) . " hours ago"; } elseif ($seconds_ago >= 60) { echo "Seen " . intval($seconds_ago / 60) . " minutes ago"; } else { echo "Seen less than a minute ago"; } 

呦可以使用:

 date("Ymd H:i:s",strtotime("1 day ago")); 
 $time_ago = ' '; $time = time() - $time; // to get the time since that moment $tokens = array ( 31536000 => 'year',2592000 => 'month',604800 => 'week',86400 => 'day',3600 => 'hour', 60 => 'minute',1 => 'second'); foreach ($tokens as $unit => $text) { if ($time < $unit)continue; $numberOfUnits = floor($time / $unit); $time_ago = ' '.$time_ago. $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'').' '; $time = $time % $unit;}echo $time_ago; 

这是我的解决scheme,请根据您的要求进行检查和修改

 function getHowLongAgo($date, $display = array('Year', 'Month', 'Day', 'Hour', 'Minute', 'Second'), $ago = '') { date_default_timezone_set('Australia/Sydney'); $timestamp = strtotime($date); $timestamp = (int) $timestamp; $current_time = time(); $diff = $current_time - $timestamp; //intervals in seconds $intervals = array( 'year' => 31556926, 'month' => 2629744, 'week' => 604800, 'day' => 86400, 'hour' => 3600, 'minute' => 60 ); //now we just find the difference if ($diff == 0) { return ' Just now '; } if ($diff < 60) { return $diff == 1 ? $diff . ' second ago ' : $diff . ' seconds ago '; } if ($diff >= 60 && $diff < $intervals['hour']) { $diff = floor($diff / $intervals['minute']); return $diff == 1 ? $diff . ' minute ago ' : $diff . ' minutes ago '; } if ($diff >= $intervals['hour'] && $diff < $intervals['day']) { $diff = floor($diff / $intervals['hour']); return $diff == 1 ? $diff . ' hour ago ' : $diff . ' hours ago '; } if ($diff >= $intervals['day'] && $diff < $intervals['week']) { $diff = floor($diff / $intervals['day']); return $diff == 1 ? $diff . ' day ago ' : $diff . ' days ago '; } if ($diff >= $intervals['week'] && $diff < $intervals['month']) { $diff = floor($diff / $intervals['week']); return $diff == 1 ? $diff . ' week ago ' : $diff . ' weeks ago '; } if ($diff >= $intervals['month'] && $diff < $intervals['year']) { $diff = floor($diff / $intervals['month']); return $diff == 1 ? $diff . ' month ago ' : $diff . ' months ago '; } if ($diff >= $intervals['year']) { $diff = floor($diff / $intervals['year']); return $diff == 1 ? $diff . ' year ago ' : $diff . ' years ago '; } } 

谢谢

 # This function prints the difference between two php datetime objects # in a more human readable form # inputs should be like strtotime($date) function humanizeDateDiffference($now,$otherDate=null,$offset=null){ if($otherDate != null){ $offset = $now - $otherDate; } if($offset != null){ $deltaS = $offset%60; $offset /= 60; $deltaM = $offset%60; $offset /= 60; $deltaH = $offset%24; $offset /= 24; $deltaD = ($offset > 1)?ceil($offset):$offset; } else{ throw new Exception("Must supply otherdate or offset (from now)"); } if($deltaD > 1){ if($deltaD > 365){ $years = ceil($deltaD/365); if($years ==1){ return "last year"; } else{ return "<br>$years years ago"; } } if($deltaD > 6){ return date('d-M',strtotime("$deltaD days ago")); } return "$deltaD days ago"; } if($deltaD == 1){ return "Yesterday"; } if($deltaH == 1){ return "last hour"; } if($deltaM == 1){ return "last minute"; } if($deltaH > 0){ return $deltaH." hours ago"; } if($deltaM > 0){ return $deltaM." minutes ago"; } else{ return "few seconds ago"; } } 

这个function不能用于英文。 我翻译了英文单词。 在使用英语之前,这需要更多的修复。

 function ago($d) { $ts = time() - strtotime(str_replace("-","/",$d)); if($ts>315360000) $val = round($ts/31536000,0).' year'; else if($ts>94608000) $val = round($ts/31536000,0).' years'; else if($ts>63072000) $val = ' two years'; else if($ts>31536000) $val = ' a year'; else if($ts>24192000) $val = round($ts/2419200,0).' month'; else if($ts>7257600) $val = round($ts/2419200,0).' months'; else if($ts>4838400) $val = ' two months'; else if($ts>2419200) $val = ' a month'; else if($ts>6048000) $val = round($ts/604800,0).' week'; else if($ts>1814400) $val = round($ts/604800,0).' weeks'; else if($ts>1209600) $val = ' two weeks'; else if($ts>604800) $val = ' a week'; else if($ts>864000) $val = round($ts/86400,0).' day'; else if($ts>259200) $val = round($ts/86400,0).' days'; else if($ts>172800) $val = ' two days'; else if($ts>86400) $val = ' a day'; else if($ts>36000) $val = round($ts/3600,0).' year'; else if($ts>10800) $val = round($ts/3600,0).' years'; else if($ts>7200) $val = ' two years'; else if($ts>3600) $val = ' a year'; else if($ts>600) $val = round($ts/60,0).' minute'; else if($ts>180) $val = round($ts/60,0).' minutes'; else if($ts>120) $val = ' two minutes'; else if($ts>60) $val = ' a minute'; else if($ts>10) $val = round($ts,0).' second'; else if($ts>2) $val = round($ts,0).' seconds'; else if($ts>1) $val = ' two seconds'; else $val = $ts.' a second'; return $val; } 

用于:

 echo elapsed_time('2016-05-09 17:00:00'); // 18 saat 8 dakika önce yazıldı. 

function:

 function elapsed_time($time){// Nekadar zaman geçmiş $diff = time() - strtotime($time); $sec = $diff; $min = floor($diff/60); $hour = floor($diff/(60*60)); $hour_min = floor($min - ($hour*60)); $day = floor($diff/(60*60*24)); $day_hour = floor($hour - ($day*24)); $week = floor($diff/(60*60*24*7)); $mon = floor($diff/(60*60*24*7*4)); $year = floor($diff/(60*60*24*7*4*12)); //difference calculate to string if($sec < (60*5)){ return 'şimdi yazıldı.'; }elseif($min < 60){ return 'biraz önce yazıldı.'; }elseif($hour < 24){ return $hour.' saat '.$hour_min.' dakika önce yazıldı.'; }elseif($day < 7){ if($day_hour!=0){$day_hour=$day_hour.' saat ';}else{$day_hour='';} return $day.' gün '.$day_hour.'önce yazıldı.'; }elseif($week < 4){ return $week.' hafta önce yazıldı.'; }elseif($mon < 12){ return $mon.' ay önce yazıldı.'; }else{ return $year.' yıl önce yazıldı.'; } } 

以下是一个非常简单,非常有效的解决scheme。

 function timeElapsed($originalTime){ $timeElapsed=time()-$originalTime; /* You can change the values of the following 2 variables based on your opinion. For 100% accuracy, you can call php's cal_days_in_month() and do some additional coding using the values you get for each month. After all the coding, your final answer will be approximately equal to mine. That is why it is okay to simply use the average values below. */ $averageNumbDaysPerMonth=(365.242/12); $averageNumbWeeksPerMonth=($averageNumbDaysPerMonth/7); $time1=(((($timeElapsed/60)/60)/24)/365.242); $time2=floor($time1);//Years $time3=($time1-$time2)*(365.242); $time4=($time3/$averageNumbDaysPerMonth); $time5=floor($time4);//Months $time6=($time4-$time5)*$averageNumbWeeksPerMonth; $time7=floor($time6);//Weeks $time8=($time6-$time7)*7; $time9=floor($time8);//Days $time10=($time8-$time9)*24; $time11=floor($time10);//Hours $time12=($time10-$time11)*60; $time13=floor($time12);//Minutes $time14=($time12-$time13)*60; $time15=round($time14);//Seconds $timeElapsed=$time2 . 'yrs ' . $time5 . 'months ' . $time7 . 'weeks ' . $time9 . 'days ' . $time11 . 'hrs ' . $time13 . 'mins and ' . $time15 . 'secs.'; return $timeElapsed; } 

echo timeElapsed(1201570814);

示例输出:

6年4个月3周4天12小时40分36秒。

这是我之前build立的通知模块的解决scheme。 它返回的输出类似于Facebook的通知下拉列表(例如1天前,刚才等)。

 public function getTimeDifference($time) { //Let's set the current time $currentTime = date('Ymd H:i:s'); $toTime = strtotime($currentTime); //And the time the notification was set $fromTime = strtotime($time); //Now calc the difference between the two $timeDiff = floor(abs($toTime - $fromTime) / 60); //Now we need find out whether or not the time difference needs to be in //minutes, hours, or days if ($timeDiff < 2) { $timeDiff = "Just now"; } elseif ($timeDiff > 2 && $timeDiff < 60) { $timeDiff = floor(abs($timeDiff)) . " minutes ago"; } elseif ($timeDiff > 60 && $timeDiff < 120) { $timeDiff = floor(abs($timeDiff / 60)) . " hour ago"; } elseif ($timeDiff < 1440) { $timeDiff = floor(abs($timeDiff / 60)) . " hours ago"; } elseif ($timeDiff > 1440 && $timeDiff < 2880) { $timeDiff = floor(abs($timeDiff / 1440)) . " day ago"; } elseif ($timeDiff > 2880) { $timeDiff = floor(abs($timeDiff / 1440)) . " days ago"; } return $timeDiff; } 

只是通过date时间这个function。 它会为您打印出来的格式

 date_default_timezone_set('your-time-zone'); function convert($datetime){ $time=strtotime($datetime); $diff=time()-$time; $diff/=60; $var1=floor($diff); $var=$var1<=1 ? 'min' : 'mins'; if($diff>=60){ $diff/=60; $var1=floor($diff); $var=$var1<=1 ? 'hr' : 'hrs'; if($diff>=24){$diff/=24;$var1=floor($diff);$var=$var1<=1 ? 'day' : 'days'; if($diff>=30.4375){$diff/=30.4375;$var1=floor($diff);$var=$var1<=1 ? 'month' : 'months'; if($diff>=12){$diff/=12;$var1=floor($diff);$var=$var1<=1 ? 'year' : 'years';}}}} echo $var1,' ',$var,' ago'; } 

最初写在这个链接和可用

 function _ago($tm,$rcs = 0) { $cur_tm = time(); $dif = $cur_tm-$tm; $pds = array('second','minute','hour','day','week','month','year','decade'); $lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600); for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]); $no = floor($no); if($no <> 1) $pds[$v] .='s'; $x=sprintf("%d %s ",$no,$pds[$v]); if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm); return $x; } 

需要一个时间()值,它会告诉你多less秒/分钟/小时/几天/几年/几十年前。

我使用了几年以下的function。 它工作正常:

 function timeDifference($timestamp) { $otherDate=$timestamp; $now=@date("Ymd H:i:s"); $secondDifference=@strtotime($now)-@strtotime($otherDate); $extra=""; if ($secondDifference == 2592000) { // months $difference = $secondDifference/2592000; $difference = round($difference,0); if ($difference>1) { $extra="s"; } $difference = $difference." month".$extra." ago"; }else if($secondDifference > 2592000) {$difference=timestamp($timestamp);} elseif ($secondDifference >= 604800) { // weeks $difference = $secondDifference/604800; $difference = round($difference,0); if ($difference>1) { $extra="s"; } $difference = $difference." week".$extra." ago"; } elseif ($secondDifference >= 86400) { // days $difference = $secondDifference/86400; $difference = round($difference,0); if ($difference>1) { $extra="s"; } $difference = $difference." day".$extra." ago"; } elseif ($secondDifference >= 3600) { // hours $difference = $secondDifference/3600; $difference = round($difference,0); if ($difference>1) { $extra="s"; } $difference = $difference." hour".$extra." ago"; } elseif ($secondDifference < 3600) { // hours // for seconds (less than minute) if($secondDifference<=60) { if($secondDifference==0) { $secondDifference=1; } if ($secondDifference>1) { $extra="s"; } $difference = $secondDifference." second".$extra." ago"; } else { $difference = $secondDifference/60; if ($difference>1) { $extra="s"; }else{$extra="";} $difference = round($difference,0); $difference = $difference." minute".$extra." ago"; } } $FinalDifference = $difference; return $FinalDifference; }