복붙노트

PHP를 사용하여 두 날짜의 차이를 계산하는 방법은 무엇입니까?

PHP

PHP를 사용하여 두 날짜의 차이를 계산하는 방법은 무엇입니까?

나는 형식의 두 날짜 :

Start Date: 2007-03-24 
End Date: 2009-06-26

이제 다음 두 가지 형식의 차이점을 찾아야합니다.

2 years, 3 months and 2 days

어떻게하면 PHP에서이 작업을 수행 할 수 있습니까?

해결법

  1. ==============================

    1.

    strtotime ()을 사용하여 두 날짜를 유닉스 시간으로 변환 한 다음 이들 사이의 초 수를 계산할 수 있습니다. 이것으로 여러 기간을 계산하는 것이 쉽습니다.

    $date1 = "2007-03-24";
    $date2 = "2009-06-26";
    
    $diff = abs(strtotime($date2) - strtotime($date1));
    
    $years = floor($diff / (365*60*60*24));
    $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
    $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
    
    printf("%d years, %d months, %d days\n", $years, $months, $days);
    

    편집 : 분명히 이것을하는 선호하는 방법은 jurka에 의해 아래에 설명 된 것과 같습니다. 내 코드는 일반적으로 PHP 5.3 이상이없는 경우에만 권장됩니다.

    의견에있는 몇몇 사람들은 위의 코드가 근사치 일 뿐이라고 지적했습니다. 나는 여전히 대부분의 용도로 괜찮다고 생각합니다. 왜냐하면 범위의 사용은 정밀도를 제공하는 것보다 오히려 시간이 경과했거나 남은 것의 의미를 제공하기위한 것이기 때문에 - 그렇게하고 싶다면 날짜를 출력하십시오.

    이 모든 노력에도 불구하고 불만 사항을 해결하기로 결정했습니다. 정확한 범위가 필요하지만 PHP 5.3에 액세스 할 수없는 경우 아래 코드를 사용하십시오 (PHP 4에서도 작동 할 것입니다). 이것은 일광 절약 시간을 고려하지 않고 PHP가 범위를 계산하기 위해 내부적으로 사용하는 코드의 직접 포트입니다. 즉, 한시간 정도의 시간이 걸린다는 것을 의미합니다. 그러나 그 사실을 제외하고는 정확해야합니다.

    <?php
    
    /**
     * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
     * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
     * 
     * See here for original code:
     * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
     * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
     */
    
    function _date_range_limit($start, $end, $adj, $a, $b, $result)
    {
        if ($result[$a] < $start) {
            $result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
            $result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
        }
    
        if ($result[$a] >= $end) {
            $result[$b] += intval($result[$a] / $adj);
            $result[$a] -= $adj * intval($result[$a] / $adj);
        }
    
        return $result;
    }
    
    function _date_range_limit_days($base, $result)
    {
        $days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    
        _date_range_limit(1, 13, 12, "m", "y", &$base);
    
        $year = $base["y"];
        $month = $base["m"];
    
        if (!$result["invert"]) {
            while ($result["d"] < 0) {
                $month--;
                if ($month < 1) {
                    $month += 12;
                    $year--;
                }
    
                $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
                $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
    
                $result["d"] += $days;
                $result["m"]--;
            }
        } else {
            while ($result["d"] < 0) {
                $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
                $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
    
                $result["d"] += $days;
                $result["m"]--;
    
                $month++;
                if ($month > 12) {
                    $month -= 12;
                    $year++;
                }
            }
        }
    
        return $result;
    }
    
    function _date_normalize($base, $result)
    {
        $result = _date_range_limit(0, 60, 60, "s", "i", $result);
        $result = _date_range_limit(0, 60, 60, "i", "h", $result);
        $result = _date_range_limit(0, 24, 24, "h", "d", $result);
        $result = _date_range_limit(0, 12, 12, "m", "y", $result);
    
        $result = _date_range_limit_days(&$base, &$result);
    
        $result = _date_range_limit(0, 12, 12, "m", "y", $result);
    
        return $result;
    }
    
    /**
     * Accepts two unix timestamps.
     */
    function _date_diff($one, $two)
    {
        $invert = false;
        if ($one > $two) {
            list($one, $two) = array($two, $one);
            $invert = true;
        }
    
        $key = array("y", "m", "d", "h", "i", "s");
        $a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
        $b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));
    
        $result = array();
        $result["y"] = $b["y"] - $a["y"];
        $result["m"] = $b["m"] - $a["m"];
        $result["d"] = $b["d"] - $a["d"];
        $result["h"] = $b["h"] - $a["h"];
        $result["i"] = $b["i"] - $a["i"];
        $result["s"] = $b["s"] - $a["s"];
        $result["invert"] = $invert ? 1 : 0;
        $result["days"] = intval(abs(($one - $two)/86400));
    
        if ($invert) {
            _date_normalize(&$a, &$result);
        } else {
            _date_normalize(&$b, &$result);
        }
    
        return $result;
    }
    
    $date = "1986-11-10 19:37:22";
    
    print_r(_date_diff(strtotime($date), time()));
    print_r(_date_diff(time(), strtotime($date)));
    
  2. ==============================

    2.

    DateTime 및 DateInterval 객체를 사용하는 것이 좋습니다.

    $date1 = new DateTime("2007-03-24");
    $date2 = new DateTime("2009-06-26");
    $interval = $date1->diff($date2);
    echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 
    
    // shows the total amount of days (not divided into years, months and days like above)
    echo "difference " . $interval->days . " days ";
    

    php DateTime :: diff 매뉴얼 더 읽기

    매뉴얼에서 :

    $date1 = new DateTime("now");
    $date2 = new DateTime("tomorrow");
    
    var_dump($date1 == $date2); // bool(false)
    var_dump($date1 < $date2);  // bool(true)
    var_dump($date1 > $date2);  // bool(false)
    
  3. ==============================

    3.

    가장 좋은 방법은 PHP의 DateTime (및 DateInterval) 객체를 사용하는 것입니다. 각 날짜는 DateTime 개체에 캡슐화 된 다음 두 날짜 간의 차이를 만들 수 있습니다.

    $first_date = new DateTime("2012-11-30 17:03:30");
    $second_date = new DateTime("2012-12-21 00:00:00");
    

    DateTime 객체는 strtotime ()과 같은 형식을 허용합니다. 훨씬 더 구체적인 날짜 형식이 필요한 경우 DateTime :: createFromFormat ()을 사용하여 DateTime 객체를 만들 수 있습니다.

    두 개체가 모두 인스턴스화 된 후 DateTime :: diff ()를 사용하여 다른 개체를 뺍니다.

    $difference = $first_date->diff($second_date);
    

    $ difference는 이제 차이 정보로 DateInterval 객체를 보유합니다. var_dump ()는 다음과 같습니다 :

    object(DateInterval)
      public 'y' => int 0
      public 'm' => int 0
      public 'd' => int 20
      public 'h' => int 6
      public 'i' => int 56
      public 's' => int 30
      public 'invert' => int 0
      public 'days' => int 20
    

    DateInterval 객체의 서식을 지정하려면 각 값을 검사하고 0 인 경우 제외해야합니다.

    /**
     * Format an interval to show all existing components.
     * If the interval doesn't have a time component (years, months, etc)
     * That component won't be displayed.
     *
     * @param DateInterval $interval The interval
     *
     * @return string Formatted interval string.
     */
    function format_interval(DateInterval $interval) {
        $result = "";
        if ($interval->y) { $result .= $interval->format("%y years "); }
        if ($interval->m) { $result .= $interval->format("%m months "); }
        if ($interval->d) { $result .= $interval->format("%d days "); }
        if ($interval->h) { $result .= $interval->format("%h hours "); }
        if ($interval->i) { $result .= $interval->format("%i minutes "); }
        if ($interval->s) { $result .= $interval->format("%s seconds "); }
    
        return $result;
    }
    

    이제 남은 것은 $ difference DateInterval 객체에서 함수를 호출하는 것입니다.

    echo format_interval($difference);
    

    그리고 우리는 올바른 결과를 얻습니다.

    목표를 달성하는 데 사용 된 전체 코드는 다음과 같습니다.

    /**
     * Format an interval to show all existing components.
     * If the interval doesn't have a time component (years, months, etc)
     * That component won't be displayed.
     *
     * @param DateInterval $interval The interval
     *
     * @return string Formatted interval string.
     */
    function format_interval(DateInterval $interval) {
        $result = "";
        if ($interval->y) { $result .= $interval->format("%y years "); }
        if ($interval->m) { $result .= $interval->format("%m months "); }
        if ($interval->d) { $result .= $interval->format("%d days "); }
        if ($interval->h) { $result .= $interval->format("%h hours "); }
        if ($interval->i) { $result .= $interval->format("%i minutes "); }
        if ($interval->s) { $result .= $interval->format("%s seconds "); }
    
        return $result;
    }
    
    $first_date = new DateTime("2012-11-30 17:03:30");
    $second_date = new DateTime("2012-12-21 00:00:00");
    
    $difference = $first_date->diff($second_date);
    
    echo format_interval($difference);
    
  4. ==============================

    4.

    시간과 분 및 초보기 ..

    $date1 = "2008-11-01 22:45:00"; 
    
    $date2 = "2009-12-04 13:44:01"; 
    
    $diff = abs(strtotime($date2) - strtotime($date1)); 
    
    $years   = floor($diff / (365*60*60*24)); 
    $months  = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); 
    $days    = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
    
    $hours   = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); 
    
    $minuts  = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); 
    
    $seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); 
    
    printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds); 
    
  5. ==============================

    5.

    다음 링크를 살펴보십시오. 이것은 지금까지 찾은 최고의 대답입니다 :)

    function dateDiff ($d1, $d2) {
    
        // Return the number of days between the two dates:    
        return round(abs(strtotime($d1) - strtotime($d2))/86400);
    
    } // end function dateDiff
    

    http://www.bizinfosys.com/php/date-difference.html

  6. ==============================

    6.

    jurka의 대답은 내가 좋아하는 것이기 때문에 투표했지만 pre-php.5.3 버전이 있습니다 ...

    나는 비슷한 문제에 직면하고 있음을 깨달았습니다. 그것은 처음에이 질문에 어떻게 접근했는지를 보여주는 것입니다. 그러나 시간 차이가 필요했습니다. 하지만 제 기능은이 점도 매우 훌륭하게 해결했으며 잃어 버리지도 잊지 않을 곳을 유지하기 위해 내 라이브러리에 아무데도 없으므로 ... 이것이 누군가에게 유용하기를 바랍니다.

    /**
     *
     * @param DateTime $oDate1
     * @param DateTime $oDate2
     * @return array 
     */
    function date_diff_array(DateTime $oDate1, DateTime $oDate2) {
        $aIntervals = array(
            'year'   => 0,
            'month'  => 0,
            'week'   => 0,
            'day'    => 0,
            'hour'   => 0,
            'minute' => 0,
            'second' => 0,
        );
    
        foreach($aIntervals as $sInterval => &$iInterval) {
            while($oDate1 <= $oDate2){ 
                $oDate1->modify('+1 ' . $sInterval);
                if ($oDate1 > $oDate2) {
                    $oDate1->modify('-1 ' . $sInterval);
                    break;
                } else {
                    $iInterval++;
                }
            }
        }
    
        return $aIntervals;
    }
    

    그리고 테스트 :

    $oDate = new DateTime();
    $oDate->modify('+111402189 seconds');
    var_dump($oDate);
    var_dump(date_diff_array(new DateTime(), $oDate));
    

    결과 :

    object(DateTime)[2]
      public 'date' => string '2014-04-29 18:52:51' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'America/New_York' (length=16)
    
    array
      'year'   => int 3
      'month'  => int 6
      'week'   => int 1
      'day'    => int 4
      'hour'   => int 9
      'minute' => int 3
      'second' => int 8
    

    여기에서 원래 아이디어를 얻었는데, 이는 내 용도에 맞게 수정 한 것입니다. (제 수정 내용도 해당 페이지에도 표시되기를 바랍니다.)

    $ aIntervals 배열에서 제거하거나 어쩌면 $ aExclude 매개 변수를 추가하거나 문자열을 출력 할 때 필터를 제거하여 원하지 않는 간격 ( "week")을 쉽게 제거 할 수 있습니다.

  7. ==============================

    7.

    PHP 프레임 워크를 사용하고 있는지 여부는 모르겠지만 많은 PHP 프레임 워크에는 날짜 / 시간 라이브러리와 헬퍼가있어 사용자가 다시 개조하지 못하게합니다.

    예를 들어 CodeIgniter에는 timespan () 함수가 있습니다. 단순히 두 개의 유닉스 타임 스탬프를 입력하면 자동으로 다음과 같은 결과가 생성됩니다 :

    1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes
    

    http://codeigniter.com/user_guide/helpers/date_helper.html

  8. ==============================

    8.

    <?php
        $today = strtotime("2011-02-03 00:00:00");
        $myBirthDate = strtotime("1964-10-30 00:00:00");
        printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24);
    ?>
    
  9. ==============================

    9.

    echo time_diff_string('2013-05-01 00:22:35', 'now');
    echo time_diff_string('2013-05-01 00:22:35', 'now', true);
    

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

    function time_diff_string($from, $to, $full = false) {
        $from = new DateTime($from);
        $to = new DateTime($to);
        $diff = $to->diff($from);
    
        $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';
    }
    
  10. ==============================

    10.

    당신은

    getdate()
    

    제공된 날짜 / 시간의 모든 요소를 ​​포함하는 배열을 반환하는 함수 :

    $diff = abs($endDate - $startDate);
    $my_t=getdate($diff);
    print("$my_t[year] years, $my_t[month] months and $my_t[mday] days");
    

    시작일과 종료일이 문자열 형식 인 경우

    $startDate = strtotime($startDateStr);
    $endDate = strtotime($endDateStr);
    

    위의 코드 전에

  11. ==============================

    11.

    나는 그것에 대한 간단한 논리를 가지고있다.

    <?php
        per_days_diff('2011-12-12','2011-12-29')
        function per_days_diff($start_date, $end_date) {
            $per_days = 0;
            $noOfWeek = 0;
            $noOfWeekEnd = 0;
            $highSeason=array("7", "8");
    
            $current_date = strtotime($start_date);
            $current_date += (24 * 3600);
            $end_date = strtotime($end_date);
    
            $seassion = (in_array(date('m', $current_date), $highSeason))?"2":"1";
    
            $noOfdays = array('');
    
            while ($current_date <= $end_date) {
                if ($current_date <= $end_date) {
                    $date = date('N', $current_date);
                    array_push($noOfdays,$date);
                    $current_date = strtotime('+1 day', $current_date);
                }
            }
    
            $finalDays = array_shift($noOfdays);
            //print_r($noOfdays);
            $weekFirst = array("week"=>array(),"weekEnd"=>array());
            for($i = 0; $i < count($noOfdays); $i++)
            {
                if ($noOfdays[$i] == 1)
                {
                    //echo "This is week";
                    //echo "<br/>";
                    if($noOfdays[$i+6]==7)
                    {
                        $noOfWeek++;
                        $i=$i+6;
                    }
                    else
                    {
                        $per_days++;
                    }
                    //array_push($weekFirst["week"],$day);
                }
                else if($noOfdays[$i]==5)
                {
                    //echo "This is weekend";
                    //echo "<br/>";
                    if($noOfdays[$i+2] ==7)
                    {
                        $noOfWeekEnd++;
                        $i = $i+2;
                    }
                    else
                    {
                        $per_days++;
                    }
                    //echo "After weekend value:- ".$i;
                    //echo "<br/>";
                }
                else
                {
                    $per_days++;
                }
            }
    
            /*echo $noOfWeek;
              echo "<br/>";
              echo $noOfWeekEnd;
              echo "<br/>";
              print_r($per_days);
              echo "<br/>";
              print_r($weekFirst);
            */
    
            $duration = array("weeks"=>$noOfWeek, "weekends"=>$noOfWeekEnd, "perDay"=>$per_days, "seassion"=>$seassion);
            return $duration;
          ?>
    
  12. ==============================

    12.

    // If you just want to see the year difference then use this function.
    // Using the logic I've created you may also create month and day difference
    // which I did not provide here so you may have the efforts to use your brain.
    // :)
    $date1='2009-01-01';
    $date2='2010-01-01';
    echo getYearDifference ($date1,$date2);
    function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
        $year = 0;
        while($date2 > $date1 = strtotime('+1 year', $date1)){
            ++$year;
        }
        return $year;
    }
    
  13. ==============================

    13.

    이것은 내 기능이다. 필수 PHP> = 5.3.4. 그것은 DateTime 클래스를 사용합니다. 매우 빠르며 빠르며 두 날짜의 차이나 심지어는 "시간 이후"라고 할 수 있습니다.

    if(function_exists('grk_Datetime_Since') === FALSE){
        function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){
            #   Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenant
            if(empty($To) === TRUE){
                $To = time();
            }
    
            #   On va s'assurer que $From est numérique
            if(is_int($From) === FALSE){
                $From = strtotime($From);
            };
    
            #   On va s'assurer que $To est numérique
            if(is_int($To) === FALSE){
                $To = strtotime($To);
            }
    
            #   On a une erreur ?
            if($From === FALSE OR $From === -1 OR $To === FALSE OR $To === -1){
                return FALSE;
            }
    
            #   On va créer deux objets de date
            $From = new DateTime(@date('Y-m-d H:i:s', $From), new DateTimeZone('GMT'));
            $To   = new DateTime(@date('Y-m-d H:i:s', $To), new DateTimeZone('GMT'));
    
            #   On va calculer la différence entre $From et $To
            if(($Diff = $From->diff($To)) === FALSE){
                return FALSE;
            }
    
            #   On va merger le tableau des noms (par défaut, anglais)
            $Words = array_merge(array(
                'year'      => 'year',
                'years'     => 'years',
                'month'     => 'month',
                'months'    => 'months',
                'week'      => 'week',
                'weeks'     => 'weeks',
                'day'       => 'day',
                'days'      => 'days',
                'hour'      => 'hour',
                'hours'     => 'hours',
                'minute'    => 'minute',
                'minutes'   => 'minutes',
                'second'    => 'second',
                'seconds'   => 'seconds'
            ), $Words);
    
            #   On va créer la chaîne maintenant
            if($Diff->y > 1){
                $Text = $Diff->y.' '.$Words['years'];
            } elseif($Diff->y == 1){
                $Text = '1 '.$Words['year'];
            } elseif($Diff->m > 1){
                $Text = $Diff->m.' '.$Words['months'];
            } elseif($Diff->m == 1){
                $Text = '1 '.$Words['month'];
            } elseif($Diff->d > 7){
                $Text = ceil($Diff->d/7).' '.$Words['weeks'];
            } elseif($Diff->d == 7){
                $Text = '1 '.$Words['week'];
            } elseif($Diff->d > 1){
                $Text = $Diff->d.' '.$Words['days'];
            } elseif($Diff->d == 1){
                $Text = '1 '.$Words['day'];
            } elseif($Diff->h > 1){
                $Text = $Diff->h.' '.$Words['hours'];
            } elseif($Diff->h == 1){
                $Text = '1 '.$Words['hour'];
            } elseif($Diff->i > 1){
                $Text = $Diff->i.' '.$Words['minutes'];
            } elseif($Diff->i == 1){
                $Text = '1 '.$Words['minute'];
            } elseif($Diff->s > 1){
                $Text = $Diff->s.' '.$Words['seconds'];
            } else {
                $Text = '1 '.$Words['second'];
            }
    
            return $Prefix.$Text.$Suffix;
        }
    }
    
  14. ==============================

    14.

    이것은 타임 스탬프가 주어 졌는지의 여부를 탐지하려고 시도 할 것이고 미래의 날짜 / 시간을 음의 값으로 반환 할 것이다 :

    <?php
    
    function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE) {
      // If $convert_to_timestamp is not explicitly set to TRUE,
      // check to see if it was accidental:
      if ($convert_to_timestamp || !is_numeric($start)) {
        // If $convert_to_timestamp is TRUE, convert to timestamp:
        $timestamp_start = strtotime($start);
      }
      else {
        // Otherwise, leave it as a timestamp:
        $timestamp_start = $start;
      }
      // Same as above, but make sure $end has actually been overridden with a non-null,
      // non-empty, non-numeric value:
      if (!is_null($end) && (!empty($end) && !is_numeric($end))) {
        $timestamp_end = strtotime($end);
      }
      else {
        // If $end is NULL or empty and non-numeric value, assume the end time desired
        // is the current time (useful for age, etc):
        $timestamp_end = time();
      }
      // Regardless, set the start and end times to an integer:
      $start_time = (int) $timestamp_start;
      $end_time = (int) $timestamp_end;
    
      // Assign these values as the params for $then and $now:
      $start_time_var = 'start_time';
      $end_time_var = 'end_time';
      // Use this to determine if the output is positive (time passed) or negative (future):
      $pos_neg = 1;
    
      // If the end time is at a later time than the start time, do the opposite:
      if ($end_time <= $start_time) {
        $start_time_var = 'end_time';
        $end_time_var = 'start_time';
        $pos_neg = -1;
      }
    
      // Convert everything to the proper format, and do some math:
      $then = new DateTime(date('Y-m-d H:i:s', $$start_time_var));
      $now = new DateTime(date('Y-m-d H:i:s', $$end_time_var));
    
      $years_then = $then->format('Y');
      $years_now = $now->format('Y');
      $years = $years_now - $years_then;
    
      $months_then = $then->format('m');
      $months_now = $now->format('m');
      $months = $months_now - $months_then;
    
      $days_then = $then->format('d');
      $days_now = $now->format('d');
      $days = $days_now - $days_then;
    
      $hours_then = $then->format('H');
      $hours_now = $now->format('H');
      $hours = $hours_now - $hours_then;
    
      $minutes_then = $then->format('i');
      $minutes_now = $now->format('i');
      $minutes = $minutes_now - $minutes_then;
    
      $seconds_then = $then->format('s');
      $seconds_now = $now->format('s');
      $seconds = $seconds_now - $seconds_then;
    
      if ($seconds < 0) {
        $minutes -= 1;
        $seconds += 60;
      }
      if ($minutes < 0) {
        $hours -= 1;
        $minutes += 60;
      }
      if ($hours < 0) {
        $days -= 1;
        $hours += 24;
      }
      $months_last = $months_now - 1;
      if ($months_now == 1) {
        $years_now -= 1;
        $months_last = 12;
      }
    
      // "Thirty days hath September, April, June, and November" ;)
      if ($months_last == 9 || $months_last == 4 || $months_last == 6 || $months_last == 11) {
        $days_last_month = 30;
      }
      else if ($months_last == 2) {
        // Factor in leap years:
        if (($years_now % 4) == 0) {
          $days_last_month = 29;
        }
        else {
          $days_last_month = 28;
        }
      }
      else {
        $days_last_month = 31;
      }
      if ($days < 0) {
        $months -= 1;
        $days += $days_last_month;
      }
      if ($months < 0) {
        $years -= 1;
        $months += 12;
      }
    
      // Finally, multiply each value by either 1 (in which case it will stay the same),
      // or by -1 (in which case it will become negative, for future dates).
      // Note: 0 * 1 == 0 * -1 == 0
      $out = new stdClass;
      $out->years = (int) $years * $pos_neg;
      $out->months = (int) $months * $pos_neg;
      $out->days = (int) $days * $pos_neg;
      $out->hours = (int) $hours * $pos_neg;
      $out->minutes = (int) $minutes * $pos_neg;
      $out->seconds = (int) $seconds * $pos_neg;
      return $out;
    }
    

    사용 예 :

    <?php
      $birthday = 'June 2, 1971';
      $check_age_for_this_date = 'June 3, 1999 8:53pm';
      $age = time_diff($birthday, $check_age_for_this_date)->years;
      print $age;// 28
    

    또는:

    <?php
      $christmas_2020 = 'December 25, 2020';
      $countdown = time_diff($christmas_2020);
      print_r($countdown);
    
  15. ==============================

    15.

    "만약"날짜가 MySQL에 저장되어 있다면 데이터베이스 레벨에서 차이 계산을하는 것이 더 쉽다는 것을 알았습니다. 그런 다음 일,시, 분, 초 출력을 기반으로 적절한 결과를 파싱하고 표시하십시오 ...

    mysql> select firstName, convert_tz(loginDate, '+00:00', '-04:00') as loginDate, TIMESTAMPDIFF(DAY, loginDate, now()) as 'Day', TIMESTAMPDIFF(HOUR, loginDate, now())+4 as 'Hour', TIMESTAMPDIFF(MINUTE, loginDate, now())+(60*4) as 'Min', TIMESTAMPDIFF(SECOND, loginDate, now())+(60*60*4) as 'Sec' from User_ where userId != '10158' AND userId != '10198' group by emailAddress order by loginDate desc;
     +-----------+---------------------+------+------+------+--------+
     | firstName | loginDate           | Day  | Hour | Min  | Sec    |
     +-----------+---------------------+------+------+------+--------+
     | Peter     | 2014-03-30 18:54:40 |    0 |    4 |  244 |  14644 |
     | Keith     | 2014-03-30 18:54:11 |    0 |    4 |  244 |  14673 |
     | Andres    | 2014-03-28 09:20:10 |    2 |   61 | 3698 | 221914 |
     | Nadeem    | 2014-03-26 09:33:43 |    4 |  109 | 6565 | 393901 |
     +-----------+---------------------+------+------+------+--------+
     4 rows in set (0.00 sec)
    
  16. ==============================

    16.

    PHP 날짜 시간 계산에 대한 여러 참조가 포함 된 다음 페이지에서 기사를 찾았습니다.

    PHP를 사용하여 두 날짜 (및 시간)의 차이를 계산합니다. 다음 페이지는 PHP를 사용하여 날짜 / 시간 계산을 수행하여 두 날짜 사이의 시간 (시, 분), 일, 월 또는 년의 차이를 결정하는 다양한 방법 (총 7 개)을 제공합니다.

    PHP 날짜 시간 - 7 날짜 차이를 계산하는 방법을 참조하십시오.

  17. ==============================

    17.

    date_create 및 date_diff 객체를 사용하는 것이 좋습니다.

    암호:

    $date1 = date_create("2007-03-24");
    $date2 = date_create("2009-06-26");
    
    $dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days');
    
    echo $dateDifference;
    

    산출:

    2 years, 3 months and 2 days
    

    자세한 정보는 PHP date_diff 매뉴얼을 참조하십시오.

  18. ==============================

    18.

    다음 코드를 사용하여 날짜 차이를 반올림하여 반환 할 수도 있습니다     $ date1 = $ duedate; // 만료일 지정     echo $ date2 = date ( "Y-m-d"); // 현재 날짜     $ ts1 = strtotime ($ date1);     $ ts2 = strtotime ($ date2);     $ seconds_diff = $ ts1 - $ ts2;     echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // 일 안에 반환

    ceil 대신 php의 floor 메소드를 사용하면 round fraction을 반환합니다. 준비 서버 시간대가 다른 경우 라이브 사이트 시간대가 다른 경우 결과가 달라질 수 있으므로 여기에서 차이점을 확인하십시오. 따라서 조건을 적절하게 변경하십시오.

  19. ==============================

    19.

    $date1 = date_create('2007-03-24');
    $date2 = date_create('2009-06-26');
    $interval = date_diff($date1, $date2);
    echo "difference : " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
    
  20. ==============================

    20.

    PHP 버전> = 5.3 : 두 개의 날짜 객체를 만든 다음 date_diff () 함수를 사용하십시오. php DateInterval 객체를 반환합니다. 문서를 보라.

    $date1=date_create("2007-03-24");
    $date2=date_create("2009-06-26");
    $diff=date_diff($date1,$date2);
    echo $diff->format("%R%a days");
    
  21. ==============================

    21.

    나는 PHP 5.2에서 동일한 문제를 가지고 MySQL로 해결했다. 정확히 당신이 찾고있는 것이 아니 겠지만, 이것은 트릭을하고 며칠을 반환 할 것입니다 :

    $datediff_q = $dbh->prepare("SELECT DATEDIFF(:date2, :date1)");
    $datediff_q->bindValue(':date1', '2007-03-24', PDO::PARAM_STR);
    $datediff_q->bindValue(':date2', '2009-06-26', PDO::PARAM_STR);
    $datediff = ($datediff_q->execute()) ? $datediff_q->fetchColumn(0) : false;
    

    여기에 대한 자세한 정보 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

  22. ==============================

    22.

    모두가 코드 샘플을 게시하기 때문에 여기에 다른 버전이 있습니다.

    몇 초에서 몇 년 (단 하나의 단위)의 차이를 표시하는 기능이 필요했습니다. 1 일 이상의 기간 동안 자정에 롤오버하기를 원했습니다 (월요일 오전 10시, 오전 9시 수요일에서 2 일전에 1이 아닌 것으로 나타남). 한 달이 넘는 기간 동안 롤오버가 같은 날 (30/31 일 월 및 윤년 포함)에 있어야합니다.

    이것이 내가 생각해 낸 것입니다.

    /**
     * Returns how long ago something happened in the past, showing it
     * as n seconds / minutes / hours / days / weeks / months / years ago.
     *
     * For periods over a day, it rolls over at midnight (so doesn't depend
     * on current time of day), and it correctly accounts for month-lengths
     * and leap-years (months and years rollover on current day of month).
     *
     * $param string $timestamp in DateTime format
     * $return string description of interval
     */
    function ago($timestamp)
    {
        $then = date_create($timestamp);
    
        // for anything over 1 day, make it rollover on midnight
        $today = date_create('tomorrow'); // ie end of today
        $diff = date_diff($then, $today);
    
        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';
        $diffW = floor($diff->d / 7);
        if ($diffW > 0) return $diffW.' week'.($diffW>1?'s':'').' ago';
        if ($diff->d > 1) return $diff->d.' day'.($diff->d>1?'s':'').' ago';
    
        // for anything less than 1 day, base it off 'now'
        $now = date_create();
        $diff = date_diff($then, $now);
    
        if ($diff->d > 0) return 'yesterday';
        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';
        return $diff->s.' second'.($diff->s==1?'':'s').' ago';
    }
    
  23. ==============================

    23.

    예전에는 format_date 함수를 작성 했으므로 날짜를 원하는 방식에 대한 많은 옵션을 제공합니다.

    function format_date($date, $type, $seperator="-")
    {
        if($date)
        {
            $day = date("j", strtotime($date));
            $month = date("n", strtotime($date));
            $year = date("Y", strtotime($date));
            $hour = date("H", strtotime($date));
            $min = date("i", strtotime($date));
            $sec = date("s", strtotime($date));
    
            switch($type)
            {
                case 0:  $date = date("Y".$seperator."m".$seperator."d",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 1:  $date = date("D, F j, Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 2:  $date = date("d".$seperator."m".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 3:  $date = date("d".$seperator."M".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 4:  $date = date("d".$seperator."M".$seperator."Y h:i A",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 5:  $date = date("m".$seperator."d".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 6:  $date = date("M",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 7:  $date = date("Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 8:  $date = date("j",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 9:  $date = date("n",mktime($hour, $min, $sec, $month, $day, $year)); break;
                case 10: 
                         $diff = abs(strtotime($date) - strtotime(date("Y-m-d h:i:s"))); 
                         $years = floor($diff / (365*60*60*24));
                         $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
                         $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
                         $date = $years . " years, " . $months . " months, " . $days . "days";
            }
        }
        return($date);
    }    
    
  24. ==============================

    24.

    매우 간단합니다 :

        <?php
            $date1 = date_create("2007-03-24");
            echo "Start date: ".$date1->format("Y-m-d")."<br>";
            $date2 = date_create("2009-06-26");
            echo "End date: ".$date2->format("Y-m-d")."<br>";
            $diff = date_diff($date1,$date2);
            echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";
        ?>
    

    자세한 내용은 다음 링크를 확인하십시오.

    PHP : date_diff - Manual

    그것은 PHP 5.3.0 이상을위한 것입니다.

  25. ==============================

    25.

    년과 월 (즉, 1 년 4 개월)의 나이를 반환 할 수있는 다음 함수를 항상 사용할 수 있습니다.

    function getAge($dob, $age_at_date)
    {  
        $d1 = new DateTime($dob);
        $d2 = new DateTime($age_at_date);
        $age = $d2->diff($d1);
        $years = $age->y;
        $months = $age->m;
    
        return $years.'.'.months;
    }
    

    또는 현재 날짜로 나이를 계산하려면 다음을 사용할 수 있습니다.

    function getAge($dob)
    {  
        $d1 = new DateTime($dob);
        $d2 = new DateTime(date());
        $age = $d2->diff($d1);
        $years = $age->y;
        $months = $age->m;
    
        return $years.'.'.months;
    }
    
  26. ==============================

    26.

    쉬운 기능

    function time_difference($time_1, $time_2, $limit = null)
    {
    
        $val_1 = new DateTime($time_1);
        $val_2 = new DateTime($time_2);
    
        $interval = $val_1->diff($val_2);
    
        $output = array(
            "year" => $interval->y,
            "month" => $interval->m,
            "day" => $interval->d,
            "hour" => $interval->h,
            "minute" => $interval->i,
            "second" => $interval->s
        );
    
        $return = "";
        foreach ($output AS $key => $value) {
    
            if ($value == 1)
                $return .= $value . " " . $key . " ";
            elseif ($value >= 1)
                $return .= $value . " " . $key . "s ";
    
            if ($key == $limit)
                return trim($return);
        }
        return trim($return);
    }
    

    좋아요 사용

    echo time_difference ($ time_1, $ time_2, "day");

    2 년 8 개월 2 일 같이 돌아갑니다.

  27. ==============================

    27.

    PHP 5.3 (각각 date_diff ())을 사용할 수 없을 때 필자가 작성한 다음 함수를 사용하고 있습니다.

            function dateDifference($startDate, $endDate)
            {
                $startDate = strtotime($startDate);
                $endDate = strtotime($endDate);
                if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0 || $startDate > $endDate)
                    return false;
    
                $years = date('Y', $endDate) - date('Y', $startDate);
    
                $endMonth = date('m', $endDate);
                $startMonth = date('m', $startDate);
    
                // Calculate months
                $months = $endMonth - $startMonth;
                if ($months <= 0)  {
                    $months += 12;
                    $years--;
                }
                if ($years < 0)
                    return false;
    
                // Calculate the days
                $measure = ($months == 1) ? 'month' : 'months';
                $days = $endDate - strtotime('+' . $months . ' ' . $measure, $startDate);
                $days = date('z', $days);   
    
                return array($years, $months, $days);
            }
    
  28. ==============================

    28.

    DateInterval은 훌륭하지만 다음과 같은 몇 가지주의 사항이 있습니다.

    이를 극복하기 위해 다음 코드를 작성했습니다 (@enobrev 응답 향상).

    function date_dif($since, $until, $keys = 'year|month|week|day|hour|minute|second')
    {
        $date = array_map('strtotime', array($since, $until));
    
        if ((count($date = array_filter($date, 'is_int')) == 2) && (sort($date) === true))
        {
            $result = array_fill_keys(explode('|', $keys), 0);
    
            foreach (preg_grep('~^(?:year|month)~i', $result) as $key => $value)
            {
                while ($date[1] >= strtotime(sprintf('+%u %s', $value + 1, $key), $date[0]))
                {
                    ++$value;
                }
    
                $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
            }
    
            foreach (preg_grep('~^(?:year|month)~i', $result, PREG_GREP_INVERT) as $key => $value)
            {
                if (($value = intval(abs($date[0] - $date[1]) / strtotime(sprintf('%u %s', 1, $key), 0))) > 0)
                {
                    $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
                }
            }
    
            return $result;
        }
    
        return false;
    }
    

    두 개의 루프를 실행합니다. 첫 번째 것은 brute-forcing을 통해 상대적인 간격 (년과 월)을 처리하고 두 번째 것은 간단한 산술로 추가 절대 간격을 계산합니다 (따라서 더 빠름).

    echo humanize(date_dif('2007-03-24', '2009-07-31', 'second')); // 74300400 seconds
    echo humanize(date_dif('2007-03-24', '2009-07-31', 'minute|second')); // 1238400 minutes, 0 seconds
    echo humanize(date_dif('2007-03-24', '2009-07-31', 'hour|minute|second')); // 20640 hours, 0 minutes, 0 seconds
    echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|day')); // 2 years, 129 days
    echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week')); // 2 years, 18 weeks
    echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week|day')); // 2 years, 18 weeks, 3 days
    echo humanize(date_dif('2007-03-24', '2009-07-31')); // 2 years, 4 months, 1 week, 0 days, 0 hours, 0 minutes, 0 seconds
    
    function humanize($array)
    {
        $result = array();
    
        foreach ($array as $key => $value)
        {
            $result[$key] = $value . ' ' . $key;
    
            if ($value != 1)
            {
                $result[$key] .= 's';
            }
        }
    
        return implode(', ', $result);
    }
    
  29. ==============================

    29.

    페니를 위해, 파운드를 위해 : 몇 가지 솔루션을 검토 한 결과 모두 25 년, 11 개월 및 20 일 동안 26 개월 12 개월 및 2 일 솔루션으로 반올림 한 floor ()를 사용하여 복잡한 솔루션을 제공했습니다 !!!!

    여기에이 문제의 제 버전이 있습니다 : 우아하지 않을 수도 있고 잘 코딩되지 않을 수도 있지만 LEAP 연도를 계산하지 않으면 더 가까운 거리에있는 답을 제공합니다. 분명히 윤년을 코딩 할 수는 있지만이 경우에는 - 다른 사람이 말했듯이 이 대답을 제공하십시오 :: 결과의 구성을보다 명확하게 볼 수 있도록 모든 테스트 조건과 print_r을 포함했습니다. 여기 간다.

    // 입력 날짜 / 변수를 설정하십시오 ::

    $ISOstartDate   = "1987-06-22";
    $ISOtodaysDate = "2013-06-22";
    

    // 다음과 같이 ISO yyyy-mm-dd 형식을 yyyy mm dd로 추출해야합니다.

    $ y 날짜 [] = 폭발 됨 ( '-', $ ISO startDate); print_r ($ Date);

    $ zDate [] = 폭발 ( '-', $ ISOtodaysDate);     print_r ($ zDate);

    // Lets Sort of the Years!
    // Lets Sort out the difference in YEARS between startDate and todaysDate ::
    $years = $zDate[0][0] - $yDate[0][0];
    
    // We need to collaborate if the month = month = 0, is before or after the Years Anniversary ie 11 months 22 days or 0 months 10 days...
    if ($months == 0 and $zDate[0][1] > $ydate[0][1]) {
        $years = $years -1;
    }
    // TEST result
    echo "\nCurrent years => ".$years;
    
    // Lets Sort out the difference in MONTHS between startDate and todaysDate ::
    $months = $zDate[0][1] - $yDate[0][1];
    
    // TEST result
    echo "\nCurrent months => ".$months;
    
    // Now how many DAYS has there been - this assumes that there is NO LEAP years, so the calculation is APPROXIMATE not 100%
    // Lets cross reference the startDates Month = how many days are there in each month IF m-m = 0 which is a years anniversary
    // We will use a switch to check the number of days between each month so we can calculate days before and after the years anniversary
    
    switch ($yDate[0][1]){
        case 01:    $monthDays = '31';  break;  // Jan
        case 02:    $monthDays = '28';  break;  // Feb
        case 03:    $monthDays = '31';  break;  // Mar
        case 04:    $monthDays = '30';  break;  // Apr
        case 05:    $monthDays = '31';  break;  // May
        case 06:    $monthDays = '30';  break;  // Jun
        case 07:    $monthDays = '31';  break;  // Jul
        case 08:    $monthDays = '31';  break;  // Aug
        case 09:    $monthDays = '30';  break;  // Sept
        case 10:    $monthDays = '31';  break;  // Oct
        case 11:    $monthDays = '30';  break;  // Nov
        case 12:    $monthDays = '31';  break;  // Dec
    };
    // TEST return
    echo "\nDays in start month ".$yDate[0][1]." => ".$monthDays;
    
    
    // Lets correct the problem with 0 Months - is it 11 months + days, or 0 months +days???
    
    $days = $zDate[0][2] - $yDate[0][2] +$monthDays;
    echo "\nCurrent days => ".$days."\n";
    
    // Lets now Correct the months to being either 11 or 0 Months, depending upon being + or - the years Anniversary date 
    // At the same time build in error correction for Anniversary dates not being 1yr 0m 31d... see if ($days == $monthDays )
    if($days < $monthDays && $months == 0)
        {
        $months = 11;       // If Before the years anniversary date
        }
    else    {
        $months = 0;        // If After the years anniversary date
        $years = $years+1;  // Add +1 to year
        $days = $days-$monthDays;   // Need to correct days to how many days after anniversary date
        };
    // Day correction for Anniversary dates
    if ($days == $monthDays )   // if todays date = the Anniversary DATE! set days to ZERO
        {
        $days = 0;          // days set toZERO so 1 years 0 months 0 days
        };
    
        echo "\nTherefore, the number of years/ months/ days/ \nbetween start and todays date::\n\n";
    
        printf("%d years, %d months, %d days\n", $years, $months, $days);
    

    최종 결과는 :: 26 년, 0 개월, 0 일

    그것이 2013 년 6 월 22 일에 얼마나 오랫동안 사업에 종사했는지입니다.

  30. ==============================

    30.

    다음은 실행 가능한 코드입니다.

            $date1=date_create('2007-03-24');
            $date2=date_create('2009-06-26');
            $diff1=date_diff($date1,$date2);
            $daysdiff= $diff1->format("%R%a");
            $daysdiff=abs($daysdiff);
    
  31. from https://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php by cc-by-sa and MIT lisence