Converting timestamp to time ago in PHP e.g 1 day ago, 2 days ago…
我试图转换格式
我找到了一个有用的脚本来做到这一点,但我认为它正在寻找一种不同的格式作为时间变量。 我想要修改以使用此格式的脚本是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; } |
我认为在前几行中脚本试图做一些看起来像这样的事情(不同的日期格式数学):
1 | $dif = 1252809479 - 2009-09-12 20:57:19; |
我如何将我的时间戳转换为(unix?)格式?
使用示例:
1 2 3 | 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); |
输入可以是任何支持的日期和时间格式。
输出:
1 2 | 4 months ago 4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago |
功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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'; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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'; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | $time_elapsed = timeAgo($time_ago); //The argument $time_ago is in timestamp (Y-m-d 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"; } } } |
这实际上是我发现的更好的解决方案。使用jQuery然而它完美地工作。它也会自动刷新,类似于SO和Facebook的方式,因此您无需刷新页面即可查看更新。
此插件将读取
1 | e.g."4 minutes ago" or"about 1 day ago |
http://timeago.yarp.com/
我不知道为什么没有人提到碳。
https://github.com/briannesbitt/Carbon
这实际上是php dateTime(这里已经使用过)的扩展,它有:diffForHumans方法。所以你需要做的就是:
1 2 | $dt = Carbon::parse('2012-9-5 23:26:11.123789'); echo $dt->diffForHumans(); |
更多例子:http://carbon.nesbot.com/docs/#api-humandiff
这个解决方案的优点:
- 它适用于未来的日期,并将返回2个月等内容。
- 你可以使用本地化来获得其他语言和复数工作正常
- 如果您将开始使用Carbon,那么使用日期的其他事情将变得非常简单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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) ); |
我发现结果如下丑:
1 years, 2 months, 0 days, 0 hours, 53 minutes and 1 seconds
因此,我实现了一个尊重复数的函数,删除空值,并可选择缩短输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function since($timestamp, $level=6) { global $lang; $date = new DateTime(); $date->setTimestamp($timestamp); $date = $date->diff(new DateTime()); // build array $since = array_combine(array('year', 'month', 'day', 'hour', 'minute', 'second'), explode(',', $date->format('%y,%m,%d,%h,%i,%s'))); // 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 year, 2 months, 53 minutes and 1 second
(可选)使用
1 year and 2 months
如果您只需要英文版本,请删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $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', ); |
我稍微修改了原始函数(在我看来更有用,或逻辑上)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 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; } |
只是扔另一种选择......
虽然我更喜欢在这里发布DateTime方法,但我不喜欢它显示0年等事实。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* * 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; } |
我做了这个,它工作得很好,它适用于像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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; } ?> |
它可以帮助你检查它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); |
我知道这里有几个答案,但这就是我想出来的。这只根据我回复的原始问题处理MySQL DATETIME值。数组$ a需要一些工作。我欢迎有关如何改进的意见。呼叫:
echo time_elapsed_string('2014-11-14 09:42:28');
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | function time_elapsed_string($ptime) { // Past time as MySQL DATETIME value $ptime = strtotime($ptime); // Current time as MySQL DATETIME value $csqltime = date('Y-m-d 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'; } |
这里的许多解决方案都不考虑舍入。 例如:
事件发生在两天前的下午3点。 如果您在下午2点检查,它将在一天前显示。 如果您在下午4点检查,它将在两天前显示。
如果您正在使用unix时间,这有助于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // how long since event has passed in seconds $secs = time() - $time_ago; // how many seconds in a day $sec_per_day = 60*60*24; // days elapsed $days_elapsed = floor($secs / $sec_per_day); // how many seconds passed today $today_seconds = date('G')*3600 + date('i') * 60 + date('s'); // how many seconds passed in the final day calculation $remain_seconds = $secs % $sec_per_day; if($today_seconds < $remain_seconds) { $days_elapsed++; } echo 'The event was '.$days_ago.' days ago.'; |
如果您担心闰秒和夏令时,这并不完美。
我试过这个,对我来说很好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | $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"); } } |
请在此处查看此链接以供参考
谢谢!玩得开心。
这就是我的用途。 它是Abbbas khan帖子的修改版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php function calculate_time_span($post_time) { $seconds = time() - strtotime($post); $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; } // uses // $post_time="2017-12-05 02:05:12"; // echo calculate_time_span($post_time); |
我通常用它来找出
OUTPUT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //If difference is greater than 7 days 7 June 2019 // if difference is greater than 24 hours and less than 7 days 1 days ago 6 days ago 1 hour ago 23 hours ago 1 minute ago 58 minutes ago 1 second ago 20 seconds ago |
码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function getDateString($date){ $dateArray = date_parse_from_format('Y/m/d', $date); $monthName = DateTime::createFromFormat('!m', $dateArray['month'])->format('F'); return $dateArray['day'] ."" . $monthName ."" . $dateArray['year']; } function getDateTimeDifferenceString($datetime){ $currentDateTime = new DateTime(getCurrentDateTime()); $passedDateTime = new DateTime($datetime); $interval = $currentDateTime->diff($passedDateTime); //$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds'); $day = $interval->format('%a'); $hour = $interval->format('%h'); $min = $interval->format('%i'); $seconds = $interval->format('%s'); if($day > 7) return getDateString($datetime); else if($day >= 1 && $day <= 7 ){ if($day == 1) return $day ." day ago"; return $day ." days ago"; }else if($hour >= 1 && $hour <= 24){ if($hour == 1) return $hour ." hour ago"; return $hour ." hours ago"; }else if($min >= 1 && $min <= 60){ if($min == 1) return $min ." minute ago"; return $min ." minutes ago"; }else if($seconds >= 1 && $seconds <= 60){ if($seconds == 1) return $seconds ." second ago"; return $seconds ." seconds ago"; } } |
你必须把每个单独的时间戳记转换成Unix时间。例如,时间戳,2009-09-12 20:57:19。
(((2008-1970)* 365)+(8 * 30)+12)* 24 + 20会给你一个粗略估计自1970年1月1日以来的小时数。
取这个数字,乘以60并加57得到分钟数。
拿它,乘以60并加19。
然而,这将非常粗略和不准确地转换它。
你有什么理由不能开始正常的Unix时间吗?
某些语言显示时间存在问题,例如在阿拉伯语中有3种需要格式来显示日期。
我在我的项目中使用这个功能,希望他们可以帮助某人(任何建议或改进,我将是apperciate :))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | /** * * @param string $date1 * @param string $date2 the date that you want to compare with $date1 * @param int $level * @param bool $absolute */ function app_date_diff( $date1, $date2, $level = 3, $absolute = false ) { $date1 = date_create($date1); $date2 = date_create($date2); $diff = date_diff( $date1, $date2, $absolute ); $d = [ 'invert' => $diff->invert ]; $diffs = [ 'y' => $diff->y, 'm' => $diff->m, 'd' => $diff->d ]; $level_reached = 0; foreach($diffs as $k=>$v) { if($level_reached >= $level) { break; } if($v > 0) { $d[$k] = $v; $level_reached++; } } return $d; } /** * */ function date_timestring( $periods, $format = 'latin', $separator = ',' ) { $formats = [ 'latin' => [ 'y' => ['year','years'], 'm' => ['month','months'], 'd' => ['day','days'] ], 'arabic' => [ 'y' => ['???','?????','?????'], 'm' => ['???','?????','????'], 'd' => ['???','?????','????'] ] ]; $formats = $formats[$format]; $string = []; foreach($periods as $period=>$value) { if(!isset($formats[$period])) { continue; } $string[$period] = $value.' '; if($format == 'arabic') { if($value == 2) { $string[$period] = $formats[$period][1]; }elseif($value > 2 && $value <= 10) { $string[$period] .= $formats[$period][2]; }else{ $string[$period] .= $formats[$period][0]; } }elseif($format == 'latin') { $string[$period] .= ($value > 1) ? $formats[$period][1] : $formats[$period][0]; } } return implode($separator, $string); } function timeago( $date ) { $today = date('Y-m-d h:i:s'); $diff = app_date_diff($date,$today,2); if($diff['invert'] == 1) { return ''; } unset($diff[0]); $date_timestring = date_timestring($diff,'latin'); return 'About '.$date_timestring; } $date1 = date('Y-m-d'); $date2 = '2018-05-14'; $diff = timeago($date2); echo $diff; |
用于:
1 | echo elapsed_time('2016-05-09 17:00:00'); // 18 saat 8 dakika ?nce yaz?ld?. |
功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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?.'; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # 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"$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"; } } |
这是我的解决方案,请根据您的要求进行检查和修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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 '; } } |
谢谢
从上面稍加修改的答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | $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'; } } |
此功能不能用于英语。我翻译了英文单词。在使用英语之前需要更多修复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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; } |
1 2 3 4 5 6 7 8 9 10 | $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; |
这是我前一段时间建立的通知模块的解决方案。它返回的输出类似于Facebook的通知下拉列表(例如,1天前,刚才等)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public function getTimeDifference($time) { //Let's set the current time $currentTime = date('Y-m-d 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; } |
以下是一个非常简单且极其有效的解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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秒。
只需将日期时间传递给此函数。它会为你准备好时间格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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'; } |
我使用以下功能已有好几年了。它工作正常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | function timeDifference($timestamp) { $otherDate=$timestamp; $now=@date("Y-m-d 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; } |