การแปลงเวลาเป็นเวลาที่ผ่านมาใน PHP เช่น 1 วันก่อน 2 วันที่ผ่านมา ...


234

ฉันพยายามแปลงเวลาของรูปแบบ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)&&(($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;
    }

ฉันคิดว่าในสองสามบรรทัดแรกสคริปต์พยายามทำสิ่งที่มีลักษณะเช่นนี้ (คณิตศาสตร์รูปแบบวันที่ที่แตกต่างกัน):

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

ฉันจะแปลงการประทับเวลาเป็นรูปแบบ (ยูนิกซ์) ได้อย่างไร



ตัวอย่าง PHP & jQuery ที่นี่freakyjolly.com/convert-date-time-to-facebook-style
Code Spy

คำตอบ:


451

ใช้ตัวอย่าง:

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);

อินพุตสามารถเป็นรูปแบบวันที่และเวลาที่รองรับวันที่และเวลารูปแบบที่สนับสนุน

ผลผลิต:

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

ฟังก์ชั่น:

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';
}

2
ส่วนของสัปดาห์นั้นดี แต่ฟังก์ชั่นโดยรวมควรมีความยืดหยุ่นมากกว่า ( $fullควรเป็นอินพุตสตริงเพื่อกรองเอาต์พุตตามต้องการ) time_elapsed_string($datetime, $format = "ymw")เช่น รุ่น PS Flat: stackoverflow.com/a/5010169/318765
mgutt

15
เกี่ยวกับความคิดเห็นล่าสุดของฉัน: เปลี่ยน$full = falseเป็น$level = 7และif (!$full) $string = array_slice($string, 0, 1);ไปยัง$string = array_slice($string, 0, $level);และโทรtime_elapsed_string($datetime, 2)เพื่อรับสตริงวันที่สูงสุดสองรายการเท่านั้น ฉันคิดว่าเรื่องนี้เหมาะกับทุกความต้องการ
mgutt

1
@ mgutt: ofc ฟังก์ชั่นนี้จะไม่ทำงานสำหรับทุกกรณีผู้ใช้ต้องการสถานการณ์; แต่มันเป็นจุดเริ่มต้นที่ดีที่คุณสามารถทำได้ด้วยการแก้ไขน้อยที่สุดได้รับสิ่งที่คุณต้องการอย่างที่คุณได้แสดงให้เห็นแล้ว ...
Glavić

1
ฉันมาUnknown property (w)ที่บรรทัดนี้$diff->w = floor($diff->d / 7);
vonUbisch

2
ในการแก้ไขปัญหาUnknown property (w)นี้ใน PHP5.3 และต่ำกว่าให้แปลง $ diff จากวัตถุให้เป็นอาร์เรย์และปรับรหัสที่เหลือตามลำดับ ฉันมีการแก้ไขที่โพสต์ที่นี่: stackoverflow.com/a/32723846/235633
bafromca

104
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';
        }
    }
}

73
นี่ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจากมีการใช้30days for monthงานและ12x30days for yearและเนื่องจากจะส่งคืนจำนวนปีที่ไม่ถูกต้องต่อปี <= 1978 ตัวอย่างที่ส่งคืน 39 ปี แต่ควร 38 ปีและใช้งานไม่ได้ เสียงร้องปี 1970 1970
Glavić

45
ทางออกที่แย่มาก ทำไมถึงมี 42 upvotes และคำตอบที่เลือก? ตั้งแต่เมื่อใดที่ทุกเดือนมี 30 วัน
BadHorsie

5
@wassimboy คุณช่วยบอกฉันหน่อยได้ไหมว่าทำไมคุณถึงต้องการโหวตให้คำตอบของฉัน หากคำตอบของฉันไม่ดีพอคุณสามารถเขียนความคิดเห็นเพื่อแก้ไขโดยไม่ต้องลงคะแนน
Ayman Hussein

8
คำตอบของคุณไม่ดีเพราะนับ 30 วันต่อเดือนและไม่ใช่ทุกเดือนมี 30 วัน อ่านความคิดเห็นอื่น ๆ ข้างต้น
Tomas Gonzalez

12
นี่คือฟังก์ชั่นเพื่อส่งคืนวลีทั่วไปเช่น "ความคิดเห็นนี้ได้ทำไปนานแค่ไหนแล้ว" มันไม่แม่นยำและมีความหายนะตามที่ได้กล่าวไว้ข้างต้น แต่สำหรับวันที่ในอดีตอันใกล้ (พูด 30 ปีที่ผ่านมาและน้อยกว่า) มันทำให้เรามีความคิดที่ไม่แม่นยำว่ามนุษย์เป็นเหตุการณ์เมื่อนานมาแล้ว ทำงานได้ดีสำหรับแอปพลิเคชันของฉัน
ทิมเดียร์บอร์น

29
$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";
        }
    }
}

ฉันไม่คิดว่ามันจะส่งผลกระทบในลักษณะที่น่าสังเกต stackoverflow.com/questions/7895966/…แต่ฉันรู้ว่าเมื่อเวลาผ่านไปและเหตุการณ์ดังกล่าวเป็นเช่น "เดือนที่ผ่านมา" มันจะต้องตรวจสอบจำนวนมากของ ifs (วินาที, นาที, ชั่วโมง, ชั่วโมง, วัน, สัปดาห์) . ดังนั้นฉันขอแนะนำให้คุณสามารถตัดส่วนเหล่านี้ถ้าส่วนที่มีด้านนอกอื่นถ้านั่นบอกว่าถ้า ($ seconds <= 604800) ด้วยวิธีการที่กรณีที่มีเดือนที่ผ่านมาจะไม่ต้องตรวจสอบอีก 4 ifs ... อีกครั้งกรณีที่น้อยกว่าเดือนจะมีพิเศษถ้า .... ทางเลือกเป็นของคุณ
Captain Red

23

นี่เป็นทางออกที่ดีกว่าที่ฉันได้พบ ใช้ jQuery แต่มันทำงานได้อย่างสมบูรณ์ นอกจากนี้ยังรีเฟรชโดยอัตโนมัติคล้ายกับวิธีที่ SO และ Facebook ทำดังนั้นคุณไม่จำเป็นต้องรีเฟรชหน้าเพจเพื่อดูการอัพเดต

ปลั๊กอินนี้จะอ่านdatetimeattr ของคุณใน<time>แท็กและกรอกให้คุณ

e.g. "4 minutes ago" or "about 1 day ago

http://timeago.yarp.com/


ทำงานอย่างสมบูรณ์แบบและแสดงผลลัพธ์ที่ต้องการในเวลา IST
Vivek

17

ฉันไม่รู้ว่าทำไมถึงไม่มีใครพูดถึง 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 สำหรับสิ่งอื่น ๆ ที่ทำงานกับวันที่จะเป็นเรื่องง่ายอย่างที่ไม่เคยเป็นมาก่อน

11

ฉันพบผลลัพธ์เช่นน่าเกลียดดังต่อไปนี้:

1 ปี, 2 เดือน, 0 วัน, 0 ชั่วโมง, 53 นาทีและ 1 วินาที

เนื่องจากการที่ฉันตระหนักถึงฟังก์ชั่นที่เคารพพหูพจน์ลบค่าว่างและเลือกที่จะเป็นไปได้ที่จะสั้นลงเอาท์พุท:

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 ปี, 2 เดือน, 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',
);

จากทั้งหมดนี้ใช้งานได้ดีสำหรับฉัน แม้ว่ามันจะไม่แสดงไปหรือที่ผ่านมา แต่ทำงานได้ทั้งสองวิธี แก้ไขได้ง่าย: ถ้า ($ date-> invert> 0) {$ ending = "to go"; } else {$ ending = "ที่ผ่านมา"; } เพียงแค่เพิ่ม $ ลงท้ายด้วย $ string
Quentin Campbell

การใช้ฟังก์ชั่น json ที่นี่เป็นที่นิยมอย่างมากและไม่จำเป็นเลย นี่ไม่ใช่ทางออกที่ดี
ซอมบี้

@zombat ขอบคุณสำหรับความคิดเห็นของคุณ ผมเปลี่ยนสายกับและexplode array_combine
mgutt

10
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
อันนี้ยอดเยี่ยมจริงๆ ขอบคุณสำหรับการแชร์. แต่มีอินสแตนซ์ที่ฟังก์ชั่นส่งกลับค่า $ numberOfUnits ที่ว่างเปล่าและมันเพิ่งจะส่งออก "ที่ผ่านมา" ดูเหมือนจะเป็นเพราะค่าน้อยกว่า 1 วินาที ในกรณีนั้นถ้าคุณสามารถทำให้มันเป็นค่าเริ่มต้นกับ "แค่ตอนนี้" มันจะสมบูรณ์แบบ
Hezerac

6

ฉันปรับเปลี่ยนฟังก์ชั่นดั้งเดิมเล็กน้อยเพื่อ (ในความคิดของฉันมีประโยชน์มากขึ้นหรือตรรกะ)

// 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;
}

ฟังก์ชั่นใด ๆ ที่ใช้คณิตศาสตร์บนพื้นฐานของปฏิทินที่ถูกแก้ไขนั้นมีข้อบกพร่องพื้นฐาน ใช้อ็อบเจกต์ Date ไม่ต้องใช้เวลาทำคณิตศาสตร์
Chris Baker

2
@ chris-baker เมื่อคนส่วนใหญ่ใช้ฟังก์ชั่นประเภทนี้ไม่จำเป็นต้องแม่นยำถึงวินาที ฟังก์ชั่นนี้มีความแม่นยำในช่วงเวลาสั้น ๆ และในระยะเวลานานการเข้าใกล้นั้นดีพอ
Bobb Fwed

5

ฉันทำสิ่งนี้และมันใช้งานได้ดีมันใช้ได้ทั้งกับยูนิกซ์เวลาประทับ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;
}

?>

ไม่ควรที่จะswitch (true)ถึงแม้ว่า$timeจะประเมินtrueหรือไม่
Mavelo

4

เพียงเพื่อโยนตัวเลือกอื่น ...

ในขณะที่ฉันชอบวิธี 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;
}

2

มันช่วยให้คุณตรวจสอบได้

   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

ฉันมักจะใช้สิ่งนี้เพื่อหาความแตกต่างระหว่างcurrentและpassed datetime stamp

เอาท์พุท

//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

รหัส

//return current date time
function getCurrentDateTime(){
    //date_default_timezone_set("Asia/Calcutta");
    return date("Y-m-d H:i:s");
}
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";
    }
}

ขอบคุณสำหรับสิ่งนี้. ฉันแปลงมันเป็นรหัส C # จริงๆ
Darrelk

ฟังก์ชันที่ไม่ได้กำหนด getCurrentDateTime () fyi
gfivehost

@gfivehost เพิ่มรหัสฟังก์ชั่นคุณสามารถตรวจสอบได้ในขณะนี้
Vicky Salunkhe

1

ฉันรู้ว่ามีคำตอบมากมายที่นี่ แต่นี่คือสิ่งที่ฉันคิดขึ้นมา เพียงจัดการค่า 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('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';
}

1

ฉันลองและใช้งานได้ดีสำหรับฉัน

$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");
    }
}

ตรวจสอบลิงค์นี้เพื่ออ้างอิงที่นี่

ขอบคุณ! และขอให้สนุก.


1

นี่คือสิ่งที่ฉันไปด้วย มันเป็นรุ่นดัดแปลงของโพสต์ของ Abbbas khan:

<?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); 

1

วิธีแก้ปัญหามากมายที่นี่ไม่ได้หมายถึงการปัดเศษ ตัวอย่างเช่น:

เหตุการณ์เกิดขึ้นเวลา 15.00 น. สองวันที่ผ่านมา หากคุณกำลังตรวจสอบเวลา 14.00 น. มันจะแสดงหนึ่งวันที่ผ่านมา หากคุณกำลังตรวจสอบเวลา 16.00 น. มันจะแสดงสองวันที่ผ่านมา

หากคุณทำงานกับเวลา unix สิ่งนี้จะช่วยให้:

// 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

ลองนี่ฉันพบมันจากรหัสเก่าของฉันซึ่งแสดงผลลัพธ์ที่ถูกต้อง

function ago($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();
    }

    // Make the entered date into Unix timestamp from MySQL datetime field

    $datefrom = strtotime($datefrom);

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

    $difference = $dateto - $datefrom;

    // 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 (true) {
        // If difference is less than 60 seconds,
        // seconds is a good interval of choice
        case(strtotime('-1 min', $dateto) < $datefrom):
            $datediff = $difference;
            $res = ($datediff == 1) ? $datediff . ' second' : $datediff . ' seconds';
            break;
        // If difference is between 60 seconds and
        // 60 minutes, minutes is a good interval
        case(strtotime('-1 hour', $dateto) < $datefrom):
            $datediff = floor($difference / 60);
            $res = ($datediff == 1) ? $datediff . ' minute' : $datediff . ' minutes';
            break;
        // If difference is between 1 hour and 24 hours
        // hours is a good interval
        case(strtotime('-1 day', $dateto) < $datefrom):
            $datediff = floor($difference / 60 / 60);
            $res = ($datediff == 1) ? $datediff . ' hour' : $datediff . ' hours';
            break;
        // If difference is between 1 day and 7 days
        // days is a good interval                
        case(strtotime('-1 week', $dateto) < $datefrom):
            $day_difference = 1;
            while (strtotime('-' . $day_difference . ' day', $dateto) >= $datefrom) {
                $day_difference++;
            }

            $datediff = $day_difference;
            $res = ($datediff == 1) ? 'yesterday' : $datediff . ' days';
            break;
        // If difference is between 1 week and 30 days
        // weeks is a good interval            
        case(strtotime('-1 month', $dateto) < $datefrom):
            $week_difference = 1;
            while (strtotime('-' . $week_difference . ' week', $dateto) >= $datefrom) {
                $week_difference++;
            }

            $datediff = $week_difference;
            $res = ($datediff == 1) ? 'last week' : $datediff . ' weeks';
            break;
        // 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
        case(strtotime('-1 year', $dateto) < $datefrom):
            $months_difference = 1;
            while (strtotime('-' . $months_difference . ' month', $dateto) >= $datefrom) {
                $months_difference++;
            }

            $datediff = $months_difference;
            $res = ($datediff == 1) ? $datediff . ' month' : $datediff . ' months';

            break;
        // 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
        case(strtotime('-1 year', $dateto) >= $datefrom):
            $year_difference = 1;
            while (strtotime('-' . $year_difference . ' year', $dateto) >= $datefrom) {
                $year_difference++;
            }

            $datediff = $year_difference;
            $res = ($datediff == 1) ? $datediff . ' year' : $datediff . ' years';
            break;
    }
    return $res;
}

ตัวอย่าง: echo ago('2020-06-03 00:14:21 AM');

เอาท์พุท: 6 days


0

คุณจะต้องใช้การประทับเวลาแต่ละชิ้นและแปลงเป็นเวลา Unix ตัวอย่างเช่นสำหรับการบันทึกเวลา, 2009-09-12 20:57:19

(((2008-1970) * 365) + (8 * 30) +12) * 24 + 20 จะให้ค่าประมาณ ROUGH ของชั่วโมงตั้งแต่วันที่ 1 มกราคม 1970

ใช้ตัวเลขนั้นคูณด้วย 60 และเพิ่ม 57 เพื่อรับนาที

เอามันคูณด้วย 60 แล้วบวก 19

ที่จะแปลงมันอย่างหยาบและไม่ถูกต้องอย่างไรก็ตาม

มีเหตุผลใดที่คุณไม่สามารถใช้เวลา Unix ปกติในการเริ่มต้นด้วยหรือไม่?


มันจะดีกว่าที่จะเก็บเป็นเวลา unix ในตาราง sql? ฉันกำลังใช้การอัปเดตการประทับเวลาอัตโนมัติ mysqls ในคอลัมน์การประทับเวลา (ซึ่งสามารถเปลี่ยนเป็นยูนิกซ์ได้) ฉันแค่เรียนรู้สิ่งที่ดีกว่า
willdanceforfun

อย่างแน่นอน. ฉันเชื่อว่าค่าเริ่มต้นสำหรับตาราง mySQL เป็นประเภทที่คุณอ้างอิง แต่เวลา Unix มีประโยชน์มากกว่า คุณสามารถเก็บมันไว้เป็น int ได้ตลอดเวลา
LukeWarm74

ฐานข้อมูลของคุณควรมีฟังก์ชั่นการแปลงวันที่เป็นรูปแบบ UNIX ใน mysql คุณใช้ UNIX_TIMESTAMP () โอ้และคุณควรจัดเก็บวันที่ของคุณเป็น DATETIME แทนที่จะเป็น INT เพื่อให้คุณสามารถใช้ฟังก์ชัน sql สำหรับการจัดการวันที่
CpnCrunch

คุณไม่ควรใช้คณิตศาสตร์ตรงเวลาเสมอ คุณกำลังสมมติว่าปฏิทินคงที่ซึ่งไม่มีอยู่ ใช้วัตถุ Date ที่ให้ไว้ใน php เพื่อทำงานกับ ... วันที่
Chris Baker

0

มีปัญหาบางอย่างกับเวลาแสดงภาษาที่ผ่านมาเช่นในภาษาอาหรับมี 3 รูปแบบที่จำเป็นในการแสดงวันที่ ฉันใช้ฟังก์ชั่นนี้ในโครงการของฉันหวังว่าพวกเขาจะสามารถช่วยเหลือใครบางคน (ข้อเสนอแนะหรือการปรับปรุงใด ๆ ที่ฉันจะ apperciate :))

/**
 *
 * @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
$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

นี่คือทางออกของฉันโปรดตรวจสอบและแก้ไขตามความต้องการของคุณ

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
# 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

ฟังก์ชั่นนี้ไม่ได้ถูกสร้างขึ้นเพื่อใช้กับภาษาอังกฤษ ฉันแปลคำศัพท์เป็นภาษาอังกฤษ ต้องมีการแก้ไขเพิ่มเติมก่อนที่จะใช้ภาษาอังกฤษ

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

การใช้:

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ı.';
        }
    }

เดือนยาวกว่า 28 วันหนึ่งปีนานกว่า 52 สัปดาห์
Augwa

-1

คำตอบที่แก้ไขเล็กน้อยจากด้านบน:

  $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';
    }
}

-2

ต่อไปนี้เป็นวิธีที่ง่ายและมีประสิทธิภาพมาก

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 วินาที


-2

นี่คือโซลูชันของฉันสำหรับโมดูลแจ้งเตือนที่ฉันได้สร้างเมื่อไม่นานมานี้ มันส่งคืนผลลัพธ์ที่คล้ายกับการแจ้งเตือนแบบเลื่อนลงของ Facebook (เช่น 1 วันที่ผ่านมาตอนนี้ ฯลฯ )

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;
}

-2

เพิ่งผ่านเวลาวันที่ไปที่ func นี้ มันจะพิมพ์ออกมาในรูปแบบที่ผ่านมาสำหรับคุณ

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';
  }

-3

ฉันใช้ฟังก์ชั่นต่อไปนี้เป็นเวลาหลายปี และมันก็ทำงานได้ดี:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.