วิธีรับความแตกต่างของเวลาในหน่วยนาทีใน PHP


คำตอบ:


92

ลบส่วนที่ผ่านมามากที่สุดจากอนาคตส่วนใหญ่และหารด้วย 60

เวลาเสร็จสิ้นในรูปแบบ Unix ดังนั้นมันจึงเป็นเพียงตัวเลขขนาดใหญ่ที่แสดงจำนวนวินาทีจาก January 1, 1970, 00:00:00 GMT


1
@Jerald วิธีการแก้ปัญหานี้เหมาะกับคุณ? คุณคิดที่จะสรุปอย่างน้อยสักเล็กน้อยหรือไม่? ขอบคุณ
Wafie Ali

7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); นี่จะคืนค่าความต่างของเวลาเป็นวินาทีจากนั้นคุณก็หารด้วย 60 แบบนี้ได้ $ nInterval = $ nInterval / 60;
Jerald

+1 สำหรับการอธิบายสิ่งที่จะต้องทำและไม่ได้ใช้ระดับ DateInterval ไร้ประโยชน์ที่ไม่ได้มีวิธีการที่จะทำเพียงแค่ว่า: ความแตกต่างกลับมาในไม่กี่นาที
AndreKR

404

คำตอบข้างต้นสำหรับ PHP เวอร์ชันเก่า ใช้คลาส DateTime เพื่อทำการคำนวณวันใด ๆ ตอนนี้ที่ PHP 5.3 เป็นบรรทัดฐาน เช่น.

$start_date = new DateTime('2007-09-01 04:10:58');
$since_start = $start_date->diff(new DateTime('2012-09-11 10:25:00'));
echo $since_start->days.' days total<br>';
echo $since_start->y.' years<br>';
echo $since_start->m.' months<br>';
echo $since_start->d.' days<br>';
echo $since_start->h.' hours<br>';
echo $since_start->i.' minutes<br>';
echo $since_start->s.' seconds<br>';

$ since_start เป็นวัตถุDateInterval โปรดทราบว่าคุณสมบัติวันสามารถใช้ได้ (เพราะเราใช้วิธี diff ของคลาส DateTime เพื่อสร้างวัตถุ DateInterval)

รหัสด้านบนจะส่งออก:

1837 วันรวม
5 ปี
0 เดือน
10 วัน
6 ชั่วโมง
14 นาที
2 วินาที

วิธีรับจำนวนนาทีทั้งหมด:

$minutes = $since_start->days * 24 * 60;
$minutes += $since_start->h * 60;
$minutes += $since_start->i;
echo $minutes.' minutes';

สิ่งนี้จะออก:

2645654 นาที

ซึ่งเป็นจำนวนนาทีจริงที่ผ่านระหว่างวันที่สองวัน คลาส DateTime จะคำนึงถึงการปรับเวลาตามฤดูกาล (ขึ้นอยู่กับเขตเวลา) ซึ่งจะไม่ใช้วิธี "แบบเก่า" อ่านคู่มือเกี่ยวกับวันที่และเวลาhttp://www.php.net/manual/en/book.datetime.php


12
Pitty DateInterval ไม่ได้มีวิธีการที่inSeconds()คล้ายกันหรือคล้ายกันตอนนี้มันซ้ำรหัสทุกที่ที่ฉันต้องคำนวณความแตกต่างในไม่กี่วินาที
Marius Balčytis

5
@barius หรือคุณสามารถเขียนฟังก์ชั่นที่ล้อมรอบรหัสการทำซ้ำหรือแม้กระทั่งขยาย DateTime และไม่ทำซ้ำรหัสของคุณ
Anther

17
+1 สำหรับคำตอบที่ถูกต้องเท่านั้นในขณะที่เขียนความคิดเห็นนี้
NB

8
การใช้คลาส DateTime ใหม่นั้นดี แต่ทำไมสร้าง DateInterval ที่ต้องถอดรหัสอย่างเชื่องช้า? $dateFrom = new DateTime('2007-09-01 04:10:58'); $dateTo = new DateTime('2012-09-11 10:25:00'); echo ($dateTo->getTimestamp()-$dateFrom->getTimestamp())/60 ;
dkloke

2
บางคนสามารถอธิบายให้ฉันฟังได้ว่าเพราะอะไรดีกว่าstrtotimeคำตอบข้างต้น ดูเหมือนว่าจะเป็นกรณีของ OOP เมื่อขั้นตอนการดำเนินการเป็นอย่างน้อยว่าเป็นวิธีการแก้ปัญหาที่ถูกต้อง (และกระชับมากขึ้น)
Bing

341

นี่คือคำตอบ:

$to_time = strtotime("2008-12-13 10:42:00");
$from_time = strtotime("2008-12-13 10:21:00");
echo round(abs($to_time - $from_time) / 60,2). " minute";

4
abs () ไม่จำเป็นต้องใช้ฟังก์ชั่นหากใครต้องการเช็คเวลาลบด้วยเช่นกัน!
ปราณ

34
สำหรับผู้ที่สงสัย/ 60,2วิธีการ: หารด้วยหกสิบปัดเศษทศนิยมสองตำแหน่งที่ใกล้ที่สุด
Bing

3
strtotime ไม่น่าเชื่อถือหลีกเลี่ยง ใช้ได้กับรูปแบบวันที่ที่ระบุเท่านั้นซึ่งส่วนใหญ่เกี่ยวข้องกับสหรัฐอเมริกา
sivann

14
strtotimeอาจล้าสมัย แต่ไม่น่าเชื่อถือหากคุณใช้อย่างถูกต้อง เหตุผลที่คุณต้องทำงานกับรูปแบบวันที่ที่สอดคล้องกันเพื่อให้สามารถอ่าน (หรือแยกวิเคราะห์) วันที่ได้อย่างถูกต้อง ดูISO 8601และอย่าตำหนิเครื่องมือ: =)
Phil

34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>

1
นี่เป็นคำอธิบายที่ประณีตและเป็นของตัวเองมาก
TheRealChx101

คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงต้องมีsleepการคำนวณความแตกต่างของวันที่?
Nico Haase

2
อะไรจะดีไปกว่าการใช้เวลาของคุณในขณะที่รอเวลาอื่นเพื่อเปรียบเทียบกับการนอนหลับอย่างรวดเร็ว แม้ว่าในทางทฤษฎีควรให้คำตอบที่ 2 ซึ่งอาจช่วยให้ผู้คนพยายามเข้าใจสูตรยืนยันว่าถูกต้อง
slappy-x

15

มันทำงานบนโปรแกรมของฉัน I'am ใช้date_diffคุณสามารถตรวจสอบdate_diffคู่มือที่นี่

$start = date_create('2015-01-26 12:01:00');
$end = date_create('2015-01-26 13:15:00');
$diff=date_diff($end,$start);
print_r($diff);

คุณได้ผลลัพธ์ที่ต้องการ


1
แปลกสำหรับฉันการใช้งานโค้ดนั้นไม่ได้ให้ความแตกต่างของเวลาเป็นนาที
Nico Haase

สิ่งนี้มีประโยชน์เฉพาะเมื่อคุณต้องการส่งออก "1 ชั่วโมง 14 นาที" ถ้าคุณต้องการเพียงไม่กี่นาทีคุณจะต้องทำคณิตศาสตร์: ($ diff-> h * 60) + $ diff-> i)
GDP

13

อีกวิธีหนึ่งกับเขตเวลา

$start_date = new DateTime("2013-12-24 06:00:00",new DateTimeZone('Pacific/Nauru'));
$end_date = new DateTime("2013-12-24 06:45:00", new DateTimeZone('Pacific/Nauru'));
$interval = $start_date->diff($end_date);
$hours   = $interval->format('%h'); 
$minutes = $interval->format('%i');
echo  'Diff. in minutes is: '.($hours * 60 + $minutes);

4
หากคุณต้องการวันมากเกินไปกว่าที่คุณเพิ่มและต่างคือ$days = $interval->format('%d'); ($days * 1440 + $hours * 60 + $minutes)สำหรับเดือน, ปี => ลอจิกเดียวกัน
Seer

12

ฉันเขียนฟังก์ชันนี้สำหรับหนึ่งในบล็อกของฉัน (แตกต่างระหว่างวันที่ผ่านมาและวันที่ของเซิร์ฟเวอร์) มันจะให้ผลลัพธ์เช่นนี้

"49 วินาทีก่อน", "20 นาทีก่อน", "21 ชั่วโมงก่อน" และอื่น ๆ

ฉันใช้ฟังก์ชั่นที่ทำให้ฉันแตกต่างระหว่างวันที่ผ่านไปและวันที่ของเซิร์ฟเวอร์

<?php

//Code written by purpledesign.in Jan 2014
function dateDiff($date)
{
  $mydate= date("Y-m-d H:i:s");
  $theDiff="";
  //echo $mydate;//2014-06-06 21:35:55
  $datetime1 = date_create($date);
  $datetime2 = date_create($mydate);
  $interval = date_diff($datetime1, $datetime2);
  //echo $interval->format('%s Seconds %i Minutes %h Hours %d days %m Months %y Year    Ago')."<br>";
  $min=$interval->format('%i');
  $sec=$interval->format('%s');
  $hour=$interval->format('%h');
  $mon=$interval->format('%m');
  $day=$interval->format('%d');
  $year=$interval->format('%y');
  if($interval->format('%i%h%d%m%y')=="00000")
  {
    //echo $interval->format('%i%h%d%m%y')."<br>";
    return $sec." Seconds";

  } 

else if($interval->format('%h%d%m%y')=="0000"){
   return $min." Minutes";
   }


else if($interval->format('%d%m%y')=="000"){
   return $hour." Hours";
   }


else if($interval->format('%m%y')=="00"){
   return $day." Days";
   }

else if($interval->format('%y')=="0"){
   return $mon." Months";
   }

else{
   return $year." Years";
   }

}
?>

บันทึกเป็นไฟล์สมมติว่า "date.php" เรียกใช้ฟังก์ชันจากหน้าอื่นเช่นนี้

<?php
 require('date.php');
 $mydate='2014-11-14 21:35:55';
 echo "The Difference between the server's date and $mydate is:<br> ";
 echo dateDiff($mydate);
?>

แน่นอนคุณสามารถปรับเปลี่ยนฟังก์ชั่นให้ผ่านสองค่าได้


10

ฉันคิดว่านี่จะช่วยคุณได้

function calculate_time_span($date){
    $seconds  = strtotime(date('Y-m-d H:i:s')) - strtotime($date);

        $months = floor($seconds / (3600*24*30));
        $day = floor($seconds / (3600*24));
        $hours = floor($seconds / 3600);
        $mins = floor(($seconds - ($hours*3600)) / 60);
        $secs = floor($seconds % 60);

        if($seconds < 60)
            $time = $secs." seconds ago";
        else if($seconds < 60*60 )
            $time = $mins." min ago";
        else if($seconds < 24*60*60)
            $time = $hours." hours ago";
        else if($seconds < 24*60*60)
            $time = $day." day ago";
        else
            $time = $months." month ago";

        return $time;
}

โปรดเพิ่มคำอธิบายลงในรหัสของคุณเพื่อให้ OP สามารถเรียนรู้จากมัน
Nico Haase

สำหรับนาที$minutes = floor(($seconds/60)%60);
Aravindh Gopi

8
function date_getFullTimeDifference( $start, $end )
{
$uts['start']      =    strtotime( $start );
        $uts['end']        =    strtotime( $end );
        if( $uts['start']!==-1 && $uts['end']!==-1 )
        {
            if( $uts['end'] >= $uts['start'] )
            {
                $diff    =    $uts['end'] - $uts['start'];
                if( $years=intval((floor($diff/31104000))) )
                    $diff = $diff % 31104000;
                if( $months=intval((floor($diff/2592000))) )
                    $diff = $diff % 2592000;
                if( $days=intval((floor($diff/86400))) )
                    $diff = $diff % 86400;
                if( $hours=intval((floor($diff/3600))) )
                    $diff = $diff % 3600;
                if( $minutes=intval((floor($diff/60))) )
                    $diff = $diff % 60;
                $diff    =    intval( $diff );
                return( array('years'=>$years,'months'=>$months,'days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff) );
            }
            else
            {
                echo "Ending date/time is earlier than the start date/time";
            }
        }
        else
        {
            echo "Invalid date/time data detected";
        }
}

8

เวอร์ชันที่เป็นสากลมากขึ้นที่ส่งคืนผลลัพธ์เป็นวันชั่วโมงนาทีหรือวินาทีรวมถึงเศษส่วน / ทศนิยม:

function DateDiffInterval($sDate1, $sDate2, $sUnit='H') {
//subtract $sDate2-$sDate1 and return the difference in $sUnit (Days,Hours,Minutes,Seconds)
    $nInterval = strtotime($sDate2) - strtotime($sDate1);
    if ($sUnit=='D') { // days
        $nInterval = $nInterval/60/60/24;
    } else if ($sUnit=='H') { // hours
        $nInterval = $nInterval/60/60;
    } else if ($sUnit=='M') { // minutes
        $nInterval = $nInterval/60;
    } else if ($sUnit=='S') { // seconds
    }
    return $nInterval;
} //DateDiffInterval

โปรดเพิ่มคำอธิบายลงในโค้ดของคุณเพื่อให้ OP สามารถเรียนรู้จากมัน
Nico Haase

7

นี่คือวิธีที่ฉันแสดง "xx ครั้งที่แล้ว" ใน php> 5.2 .. นี่คือข้อมูลเพิ่มเติมเกี่ยวกับวัตถุDateTime

//Usage:
$pubDate = $row['rssfeed']['pubDates']; // e.g. this could be like 'Sun, 10 Nov 2013 14:26:00 GMT'
$diff = ago($pubDate);    // output: 23 hrs ago

// Return the value of time different in "xx times ago" format
function ago($timestamp)
{

$today = new DateTime(date('y-m-d h:i:s')); // [2]
//$thatDay = new DateTime('Sun, 10 Nov 2013 14:26:00 GMT');
$thatDay = new DateTime($timestamp);
$dt = $today->diff($thatDay);

if ($dt->y > 0)
{
    $number = $dt->y;
    $unit = "year";
}
else if ($dt->m > 0)
{
    $number = $dt->m;
    $unit = "month";
}   
else if ($dt->d > 0)
{
    $number = $dt->d;
   $unit = "day";
}
else if ($dt->h > 0)
{
    $number = $dt->h;
    $unit = "hour";
}
else if ($dt->i > 0)
{
    $number = $dt->i;
    $unit = "minute";
}
else if ($dt->s > 0)
{
    $number = $dt->s;
    $unit = "second";
}

$unit .= $number  > 1 ? "s" : "";

$ret = $number." ".$unit." "."ago";
return $ret;
}


3

ลบเวลาและหารด้วย 60

นี่คือตัวอย่างที่คำนวณเวลาที่ผ่านไปจากเป็น2019/02/01 10:23:45นาที:

$diff_time=(strtotime(date("Y/m/d H:i:s"))-strtotime("2019/02/01 10:23:45"))/60;

2

โซลูชันของฉันเพื่อค้นหาความแตกต่างระหว่างวันที่สองวันอยู่ที่นี่ ด้วยฟังก์ชั่นนี้คุณสามารถค้นหาความแตกต่างเช่นวินาที, นาที, ชั่วโมง, วัน, ปีและเดือน

function alihan_diff_dates($date = null, $diff = "minutes") {
 $start_date = new DateTime($date);
 $since_start = $start_date->diff(new DateTime( date('Y-m-d H:i:s') )); // date now
 print_r($since_start);
 switch ($diff) {
    case 'seconds':
        return $since_start->s;
        break;
    case 'minutes':
        return $since_start->i;
        break;
    case 'hours':
        return $since_start->h;
        break;
    case 'days':
        return $since_start->d;
        break;      
    default:
        # code...
        break;
 }
}

คุณสามารถพัฒนาฟังก์ชั่นนี้ ฉันทดสอบและทำงานให้ฉัน เอาต์พุตวัตถุ DateInterval อยู่ที่นี่:

/*
DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 [i] => 5 [s] => 13 [f] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 0 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) 
*/

ฟังก์ชั่นการใช้งาน:

$ date = วันที่ผ่านมา $ diff = ประเภทเช่น: "นาที", "วัน", "วินาที"

$diff_mins = alihan_diff_dates("2019-03-24 13:24:19", "minutes");

โชคดี.


0

สิ่งนี้จะช่วย ....

function get_time($date,$nosuffix=''){
    $datetime = new DateTime($date);
    $interval = date_create('now')->diff( $datetime );
    if(empty($nosuffix))$suffix = ( $interval->invert ? ' ago' : '' );
    else $suffix='';
    //return $interval->y;
    if($interval->y >=1)        {$count = date(VDATE, strtotime($date)); $text = '';}
    elseif($interval->m >=1)    {$count = date('M d', strtotime($date)); $text = '';}
    elseif($interval->d >=1)    {$count = $interval->d; $text = 'day';} 
    elseif($interval->h >=1)    {$count = $interval->h; $text = 'hour';}
    elseif($interval->i >=1)    {$count = $interval->i; $text = 'minute';}
    elseif($interval->s ==0)    {$count = 'Just Now'; $text = '';}
    else                        {$count = $interval->s; $text = 'second';}
    if(empty($text)) return '<i class="fa fa-clock-o"></i> '.$count;
    return '<i class="fa fa-clock-o"></i> '.$count.(($count ==1)?(" $text"):(" ${text}s")).' '.$suffix;     
}

1
โปรดเพิ่มคำอธิบายลงในโค้ดของคุณเพื่อให้ OP สามารถเรียนรู้จากมัน
Nico Haase

0

ฉันพบวิธีแก้ปัญหามากมาย แต่ฉันไม่เคยได้วิธีแก้ไขปัญหา แต่ฉันได้สร้างรหัสเพื่อค้นหานาทีโปรดตรวจสอบ

<?php

  $time1 = "23:58";
  $time2 = "01:00";
  $time1 = explode(':',$time1);
  $time2 = explode(':',$time2);
  $hours1 = $time1[0];
  $hours2 = $time2[0];
  $mins1 = $time1[1];
  $mins2 = $time2[1];
  $hours = $hours2 - $hours1;
  $mins = 0;
  if($hours < 0)
  {
    $hours = 24 + $hours;
  }
  if($mins2 >= $mins1) {
        $mins = $mins2 - $mins1;
    }
    else {
      $mins = ($mins2 + 60) - $mins1;
      $hours--;
    }
    if($mins < 9)
    {
      $mins = str_pad($mins, 2, '0', STR_PAD_LEFT);
    }
    if($hours < 9)
    {
      $hours =str_pad($hours, 2, '0', STR_PAD_LEFT);
    }
echo $hours.':'.$mins;
?>

ให้ผลลัพธ์เป็นชั่วโมงและนาทีเช่น 01 ชั่วโมง 02 นาทีเช่น 01:02

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