Cách hiển thị "12 phút trước" vv trong một trang web PHP?


22

Bất cứ ai có thể cho tôi biết cách tôi có thể hiển thị thông báo trạng thái như "12 giây trước" hoặc "5 phút trước" vv trong một trang web?

  0

Câu hỏi này được [trước đây được yêu cầu] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time), mã ví dụ trong câu trả lời sẽ khá dễ dàng chuyển đổi sang PHP. 20 aug. 082008-08-20 20:07:06

+1

Điều này đã được đề cập (mặc dù tập trung nhiều hơn C#) trong [chủ đề này] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time). 20 aug. 082008-08-20 20:05:18

  0

câu hỏi tuyệt vời :) 24 apr. 132013-04-24 12:30:28

  0

Có một plugin jquery đẹp: timeago.js 27 apr. 132013-04-27 04:46:05

63

Đây là mã php cho cùng:

function time_since($since) { 
    $chunks = array(
     array(60 * 60 * 24 * 365 , 'year'), 
     array(60 * 60 * 24 * 30 , 'month'), 
     array(60 * 60 * 24 * 7, 'week'), 
     array(60 * 60 * 24 , 'day'), 
     array(60 * 60 , 'hour'), 
     array(60 , 'minute'), 
     array(1 , 'second') 
    ); 

    for ($i = 0, $j = count($chunks); $i < $j; $i++) { 
     $seconds = $chunks[$i][0]; 
     $name = $chunks[$i][1]; 
     if (($count = floor($since/$seconds)) != 0) { 
      break; 
     } 
    } 

    $print = ($count == 1) ? '1 '.$name : "$count {$name}s"; 
    return $print; 
} 

Chức năng mất số giây như là đầu vào và đầu ra văn bản như:

  • 10 giây
  • 1 phút

vv

  0

Chức năng đẹp :) 23 aug. 092009-08-23 20:44:54

  0

Oh và đừng quên thay đổi các phép nhân đó với các giá trị thực, để nó không được tính mỗi khi nó chạy:) 23 aug. 092009-08-23 21:07:39

+10

Vì tôi tò mò, việc thay thế trình tự nhân với các sản phẩm được đánh giá nhanh hơn ~ 1.2%. 24 aug. 092009-08-24 01:04:06

+5

Nó chỉ hiển thị '33 phút 'bất kể tôi thay đổi ngày và giờ quá 24 feb. 132013-02-24 18:18:02

+5

@ErikEdgren Tôi đã có cùng một vấn đề vì tôi đã gửi ngày thay vì giây. Hãy thử điều này: 'time_since (time() - strtotime ($ datetime))' 02 aug. 132013-08-02 15:12:54

  0

TWEAK WITH JUST NOW. function time_since ($ since) { \t $ chunks = mảng (mảng (60 * 60 * 24 * 365, 'năm'), mảng (60 * 60 * 24 * 30, 'tháng'), mảng (60 * 60 * 24 * 7, 'tuần'), mảng (60 * 60 * 24, 'ngày'), mảng (60 * 60, 'giờ'), mảng (60, 'phút'), mảng (1, 'giây')); \t cho ($ i = 0, $ j = số ($ chunks); $ i <$ j; $ i ++) { \t \t $ giây = $ chunks [$ i] [0]; \t \t $ name = $ chunks [$ i] [1]; \t $ count = floor ($ kể từ/$ giây); \t nếu ($ count! = 0) {break;} \t} if ($ count == 1) {\t \t return $ print = '1'. $ Name;} else if ($ count <1) {return \t $ print = 'vừa mới'; \t} else {\t trả về $ print = "$ count {$ name} s";}} 31 jan. 182018-01-31 23:26:33


7
function timeAgo($timestamp){ 
    $datetime1=new DateTime("now"); 
    $datetime2=date_create($timestamp); 
    $diff=date_diff($datetime1, $datetime2); 
    $timemsg=''; 
    if($diff->y > 0){ 
     $timemsg = $diff->y .' year'. ($diff->y > 1?"'s":''); 

    } 
    else if($diff->m > 0){ 
    $timemsg = $diff->m . ' month'. ($diff->m > 1?"'s":''); 
    } 
    else if($diff->d > 0){ 
    $timemsg = $diff->d .' day'. ($diff->d > 1?"'s":''); 
    } 
    else if($diff->h > 0){ 
    $timemsg = $diff->h .' hour'.($diff->h > 1 ? "'s":''); 
    } 
    else if($diff->i > 0){ 
    $timemsg = $diff->i .' minute'. ($diff->i > 1?"'s":''); 
    } 
    else if($diff->s > 0){ 
    $timemsg = $diff->s .' second'. ($diff->s > 1?"'s":''); 
    } 

$timemsg = $timemsg.' ago'; 
return $timemsg; 
} 
  0

Tôi đã sử dụng phiên bản sửa đổi này, tôi đã thay thế dòng date_create bằng $ datetime2 = new DateTime(); $ datetime2-> setTimestamp ($ timestamp); và xóa tất cả các dấu nháy trước chuỗi s 02 aug. 162016-08-02 09:30:10


3

PHP \DateTime::diff trả về một đối tượng \DateInterval mà bạn có thể nhận số phút theo tài sản công khai i.