Преобразуване на клеймото във времето в PHP, например преди 1 ден, преди 2 дни ...

Опитвам се да конвертирам timestamp за 2009-09-12 20:57:19 и да го превърна в нещо като 3 minutes ago с PHP.

Намерих полезен скрипт за това, но мисля, че търси друг формат, който ще се използва като времева променлива. скрипт, който искам да променя, за да работи с този формат:

 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) = $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) >= 1) > 0)) $x .= time_ago($_tm); return $x; } 

Мисля, че в първите няколко реда скриптът се опитва да направи нещо подобно на това (друга математика във формат за дата):

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

Как мога да конвертирам моя timestamp във формат (unix?)?

158
13 сент. willdanceforfun е на 13 септември. 2009-09-13 05:39 '09 в 5:39 2009-09-13 05:39
@ 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 =>  { 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'; } 
289
04 сент. отговорът е даден Главич 04 септ. 2013-09-04 01:24 '13 в 1:24 2013-09-04 01:24
 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'; } } } 
border=0
100
15 янв. отговорът е даден от Айман Хюсеин 15 януари. 2013-01-15 16:59 '13 в 16:59 2013-01-15 16:59
22
25 сент. отговора даден Капитан Ред 25 септ 2014-09-25 13:15 '14 в 13:15 2014-09-25 13:15

Това е наистина най-доброто решение, което намерих. Използва jQuery, но работи добре. Той също така се актуализира автоматично , подобно на това как SO и Facebook го правят, така че не е необходимо да обновявате страницата, за да видите актуализациите.

Този плъгин ще прочете вашето datetime attr в <time> и ще го попълни за вас.

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

http://timeago.yarp.com/

15
19 янв. отговорът е даден от Панама Джак 2014-01-19 10:52 '14 в 10:52 ч. 2014-01-19 10:52
 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) ); 
7
30 марта '16 в 3:15 2016-03-30 03:15 Отговорът е даден от Bryce64 на 30 март 2006 г. в 3:15 2016-03-30 03:15

Намерих резултати, подобни на следните грозни:

1 година, 2 месеца, 0 дни, 0 часа, 53 минути и 1 секунда.

Поради това реализирах функция, която отчита множествено число, премахва празни стойности и може би можете да намалите резултата:

 function since($timestamp, $level=6) { global $> 

Изглежда много по-добре:

1 година, 5 дни, 53 минути и 1 секунда

Ако е необходимо, използвайте $level = 2 за да го намалите, както следва:

1 година и 2 месеца

Премахнете част от $> ако ви е необходима само на английски или редактирайте този превод, за да отговаря на нуждите ви

 $> 
4
28 марта '17 в 17:59 2017-03-28 17:59 отговорът е даден от mgutt 28 март, '17 в 17:59 2017-03-28 17:59

Направих го и работи добре, работейки както за unix timestamp, например 1470919932 , така и за форматирано време, например, 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; } ?> 
4
11 авг. Отговор, даден от Ахмад ghoneim 11 Aug 2016-08-11 15:54 '16 в 15:54 2016-08-11 15:54

Промених първоначалната функция малко да бъде (по мое мнение, по-полезни или логично).

 // 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; } 
4
03 апр. Отговорът е даден от Bobb Fwed 03 Apr. 2013-04-03 19:42 '13 в 19:42 ч. 2013-04-03 19:42

Не знам защо никой друг не споменава Carbon.

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

Предимства на това решение:

  • работи за бъдещи дати и връща нещо като след 2 месеца и т.н.
  • можете да използвате локализация, за да получите други езици, а плурализацията работи добре
  • ако започнете да използвате Carbon за други неща, които работят с дати, то ще бъде толкова лесно, колкото някога.
4
21 июня '16 в 14:33 2016-06-21 14:33 отговорът е даден Krzysztof Duszczyk 21 юни '16 в 14:33 2016-06-21 14:33

Просто за да добавите друга опция ...

Въпреки че тук предпочитам да публикувам метода DateTime, не ми хареса факта, че той показва 0 години и т.н.

  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; } 
3
30 янв. Отговорът е даден от Том Харт на 30 януари 2015-01-30 13:44 '15 в 13:44 2015-01-30 13:44

това ще ви помогне да го проверите

  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); 
2
26 авг. Отговор, даден от Аббас хан на 26 август 2016-08-26 17:37 '16 в 17:37 2016-08-26 17:37

Знам, че тук има няколко отговора, но това е, което измислих. Това се отнася само за стойностите на 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'; } 
1
14 янв. Отговорът е даден от rdpcoder Jan 14 2015-01-14 23:38 '15 в 23:38 2015-01-14 23:38

Това е, с което отидох. Неговата модифицирана версия на съобщението е Аббас хан:

 <?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); 
0
05 дек. отговор, даден drtechno 05 Дек. 2017-12-05 21:23 '17 в 21:23 2017-12-05 21:23

Вие ще трябва да вземете всеки един фрагмент от вашето време и да го конвертирате по време на Unix. Например, за времевата маркировка, 2009-09-12 20:57:19.

(((2008-1970) * 365) + (8 * 30) +12) * 24 + 20 ще ви даде рейтинга ROUGH от 1 януари 1970 година.

Вземете този номер, умножете по 60 и добавете 57, за да получите минутите.

Вземете го, умножете по 60 и добавете 19.

Това може да го направи много груб и неточен.

Има ли причина, поради която не можете да започнете редовното време на Unix?

0
13 сент. LukeWarm74 публикуван на 13 септември 2009-09-13 05:45 '09 в 5:45 ч. 2009-09-13 05:45

Леко променен отговор отгоре:

  $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'; } } 
0
28 июля '16 в 17:12 2016-07-28 17:12 отговорът е даден на г-н Sorbose на 28 юли, 16 в 17:12 часа

Опитах го и тя работи добре за мен

 $datetime1 = new DateTime('2009-10-11'); $datetime2 = new DateTime('2009-10-10'); $difference = $datetime1->diff($datetime2); echo formatOutput($difference); function formatOutput($diff){  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"); } } 

Маркирайте тази връзка за справка тук.

Благодаря! и се забавлявайте.

0
24 окт. Отговор, даден от Ruberandinda Patience 24 октомври. 2017-10-24 12:14 '17 в 12:14 2017-10-24 12:14

Ако използвате MySQL, използвайте UNIX_TIMESTAMP() .

0
23 сент. Отговор CpnCrunch 23 септември 2013-09-23 23:41 '13 в 23:41 ч. 2013-09-23 23:41
 # 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"; } } 
-1
17 окт. отговорът е даден Рамеш 17 октомври. 2014-10-17 15:50 '14 в 15:50 2014-10-17 15:50

Употреба:

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

функции:

 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
10 мая '16 в 11:23 2016-05-10 11:23 Отговорът е даден Безгранично isa 10 май '16 в 11:23 2016-05-10 11:23
 $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; 
-1
18 марта '14 в 12:53 2014-03-18 12:53 отговорът е даден от Mehreen Jamil на 18 март 14 в 12:53 2014-03-18 12:53

Можете да използвате:

 date("Ymd H:i:s",strtotime("1 day ago")); 
-1
12 нояб. Отговор, даден от Уилям Уонг Гарай 12 ноември 2012-11-12 21:19 '12 в 21:19 2012-11-12 21:19

Тази функция не е предназначена за използване на английски език. Преведох думите на английски. Това е необходимо за по-голяма фиксация преди употреба на английски език.

 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
16 дек. отговор даден shnisaka 16 декември. 2014-12-16 23:27 '14 в 23:27 2014-12-16 23:27

Ето моето решение, моля проверете и променете според вашите изисквания.

 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
09 окт. отговор, даден Dineshaws Окт 09. 2014-10-09 16:08 '14 в 16:08 2014-10-09 16:08

Следното е много просто и изключително ефективно решение.

 function timeElapsed($originalTime){ $timeElapsed=time()-$originalTime;  $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; } се използва средната стойност function timeElapsed($originalTime){ $timeElapsed=time()-$originalTime;  $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; } 

Изминало време за ехо (1201570814);

Примерни изходни данни:

6 години 4 месеца 3 седмици 4 дни 12 часа 40 минути и 36 секунди.

-2
24 июня '14 в 22:37 2014-06-24 22:37 отговорът е даден от user3008679 юни 24 '14 в 22:37 2014-06-24 22:37

Ето моето решение за модула за уведомяване, който построих преди време. Тя връща изход, подобен на падащия списък с известия във Facebook (например преди 1 ден, точно сега и т.н.).

 public function getTimeDifference($time) { //Let 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; } 
-2
04 июля '14 в 11:51 2014-07-04 11:51 отговорът е даден от Ciaran на 04 юли 2014 г. в 11:51 2014-07-04 11:51

просто въведете датата за тази функция. той ще отпечата формата за време за вас

 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'; } 
-2
20 апр. отговорът е даден на 20 април. 2014-04-20 11:28 '14 в 11:28 2014-04-20 11:28

Първоначално написана и достъпна за това

 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) = $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) >= 1) > 0)) $x .= time_ago($_tm); return $x; } 

Стойността time () е необходима и ще ви каже колко секунди / минути / часове / дни / години / десетилетия.

-2
10 янв. Отговор, даден от Usman Shaukat Jan 10 2015-01-10 18:42 '15 в 18:42 2015-01-10 18:42

Използвам следната функция в продължение на няколко години. И работи чудесно:

 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; } 
-3
16 нояб. отговорът е даден от Айяз Зафар 16 ноември. 2015-11-16 20:02 '15 в 20:02 2015-11-16 20:02

Други въпроси относно маркерите на или задайте въпрос