как рассчитать число Январь месяц между двумя датами с использованием php [duplicate]

Используйте метод .on() jQuery http://api.jquery.com/on/ для присоединения обработчиков событий к элементу live.

Также с версии 1.9 .live() удаляется.

653
задан Taryn 22 March 2017 в 17:23
поделиться

31 ответ

Для PHP & lt; 5.3 в противном случае см. Ответ юрка ниже

Вы можете использовать strtotime () для преобразования двух дат в unix-время, а затем вычислить количество секунд между ними. Из этого довольно легко рассчитать разные периоды времени.

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

Изменить: Очевидно, что предпочтительный способ сделать это подобен описанному ниже юркой. Мой код обычно рекомендуется только в том случае, если у вас нет 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)));
480
ответ дан Toby Allen 20 August 2018 в 08:10
поделиться
  • 1
    Если вы используете класс DateTime, вы можете перейти к $ date- & gt; format ('U'), чтобы получить отметку времени unix. – Jon Cram 7 August 2009 в 14:26
  • 2
    Это неправда, если вам приходится иметь дело с летним / зимним временем. В этом конкретном случае, когда вы настраиваете лето / зиму, один день равен 23 или 25 часам. – Arno 21 December 2009 в 16:54
  • 3
    Хорошо, тот же аргумент можно было бы сделать и в високосные годы. Это не учитывает это. Тем не менее, я не уверен, что вы даже хотите принять это во внимание, так как мы обсуждаем диапазон здесь. Семантика для диапазона несколько отличается от семантики абсолютной даты. – Emil H 21 December 2009 в 21:35
  • 4
    Эта функция неверна. Это полезно для приближения, но неверно для точных диапазонов. Во-первых, он предполагает, что есть 30 дней в месяц, то есть он будет иметь такую ​​же разницу дней между 1 февраля и 1 марта, как это будет с 1 июля по 1 августа (независимо от високосного года). – enobrev 11 April 2011 в 20:14
  • 5
    В PHP ссылочные переменные находятся в сигнатуре функции, а не в вызове. Переместите все ваши & в подписи. – Paul Tarjan 19 March 2013 в 11:32

Я проголосовал за jurka answer , так как это мой любимый, но у меня есть версия pre-php.5.3 ...

I обнаружил, что я работаю над подобной проблемой - именно так я столкнулся с этим вопросом в первую очередь, но просто нуждался в разнице в часах. Но моя функция также решила эту проблему очень хорошо, и у меня нет нигде в моей собственной библиотеке, чтобы она не терялась и не забывалась, поэтому ... надеюсь, что это кому-то полезно.

/**
 *
 * @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 или просто отфильтровать их при выводе строки.

13
ответ дан Community 20 August 2018 в 08:10
поделиться
  • 1
    К сожалению, это не возвращает то же, что и DateInterval из-за переполнения года / месяца. – Stephen Harris 18 August 2012 в 11:56
  • 2
    @StephenHarris: Я не тестировал это, но, читая код, я уверен, что он должен вернуть тот же результат - при условии, что вы удалите индекс week в $aIntervals (поскольку DateDiff никогда не использует это). – Alix Axel 1 November 2012 в 21:07

Это моя функция. Требуется 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;
    }
}
5
ответ дан David Bélanger 20 August 2018 в 08:10
поделиться

«если» дата хранится в 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)
4
ответ дан ElasticThoughts 20 August 2018 в 08:10
поделиться

Просмотр часов, минут и секунд ..

$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); 
33
ответ дан Emil H 20 August 2018 в 08:10
поделиться
  • 1
    Вероятно, это не даст точного результата. – Dolphin 5 August 2011 в 09:24
  • 2
    И это ужасное решение, если вы не вынуждены использовать ужасно устаревшую версию PHP ... – rdlowrey 24 March 2012 в 19:50
  • 3
    Не так DRY . Например, 60 * 60 * 24 повторяется 15 раз. Долгое повторное использование копий-пасты! – Peter Mortensen 9 April 2014 в 00:07
  • 4
    Как насчет високосных лет? В среднем год не составляет 365 дней. – Peter Mortensen 9 April 2014 в 00:10
  • 5
    Этот код предполагает, что в среднем месяц составляет 30 дней. Даже если предположить, что 365 дней в году, средний месяц составляет 365/12 = 30,42 дня (приблизительно). – Peter Mortensen 9 April 2014 в 00:16

Пример использования:

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';
}
7
ответ дан Glavić 20 August 2018 в 08:10
поделиться

У меня есть для этого простая логика:

<?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;
      ?>
6
ответ дан Hardik Raval 20 August 2018 в 08:10
поделиться
  • 1
    Кажется, что что-то не хватает в конце примерного кода (конечная скобка и «? & Gt; »?). – Peter Mortensen 9 April 2014 в 00:52
  • 2
    & Quot; простой & Quot; логика. Это не менее 40 строк чистого кода. – Madjosz 13 February 2018 в 14:17
// 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;
}
5
ответ дан Helen 20 August 2018 в 08:10
поделиться
  • 1
    Ли "strtotime ('+ 1 год', $ date1) & quot; учитывать високосные годы? – Peter Mortensen 9 April 2014 в 00:38

Я предлагаю использовать объекты 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 manual

Из руководства:

Начиная с PHP 5.2.2, объекты DateTime можно сравнить с помощью операторов сравнения.

$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)
810
ответ дан hitautodestruct 20 August 2018 в 08:10
поделиться
  • 1
    +1 Этот подход ООП намного более краткий, чем функциональный подход floor (). – systemovich 14 December 2010 в 14:56
  • 2
    обратите внимание, что DateTime- & gt; diff () - php 5.3+ – cerberos 1 April 2011 в 09:58
  • 3
    +1 DateTime правильно обрабатывает високосные годы и временные зоны, и для полки есть хорошая книга: phparch.com/books/… – hakre 7 August 2011 в 13:03
  • 4
    обратите внимание, что PHP 5.3 отсутствует с 2009 года – feeela 9 February 2012 в 15:32
  • 5
    Есть ли метод, который дает общее количество секунд между двумя DateTimes? (без добавления компонентов, то есть) – potatoe 19 February 2012 в 05:52

Я не знаю, используете ли вы фреймворк PHP или нет, но у многих фреймворков PHP есть библиотеки времени и времени, чтобы помочь вам не изобретать колесо.

Например, CodeIgniter имеет функцию timespan(). Просто введите две временные метки Unix, и она автоматически создаст такой результат:

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

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

11
ответ дан Jake Wilson 20 August 2018 в 08:10
поделиться

Это попытается определить, была ли дана отметка времени или нет, а также будет возвращать будущие даты / время как отрицательные значения:

<?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);
4
ответ дан jerdiggity 20 August 2018 в 08:10
поделиться

Лучший способ действия - использовать объекты 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 с информацией о разности. A 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);

И мы получаем правильный результат:

20 дней 6 часов 56 минут 30 секунд

Полный код, используемый для достижения цели:

/**
 * 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);
63
ответ дан Madara Uchiha 20 August 2018 в 08:10
поделиться
  • 1
    DateTime () не работает на моем php-сервере – Sagar G. 22 July 2013 в 17:15
  • 2
    DateTime() не является функцией, это объект, и он существует с PHP 5.2. Убедитесь, что ваш сервер поддерживает его. – Madara Uchiha♦ 22 July 2013 в 17:21
  • 3
    @SecondRikudo DateTime :: Diff нужен PHP 5.3.0 – PhoneixS 7 July 2014 в 10:21
  • 4
    У нас есть проблема, замените first_date на second_date, и мы получим такой же результат? Почему бы не сказать 0 дней 0 часов 0 минут 0 секунд или только 0. Пример: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 и 2012-12-21 00:00:00 - 2012-11-30 17:03:30 получить тот же результат. – EgoistDeveloper 22 September 2017 в 08:49
  • 5
    Потому что diff дает вам разницу между двумя моментами. Разница не равна 0, независимо от того, какая дата наступает позже. – Madara Uchiha♦ 22 September 2017 в 16:11

Вы можете использовать функцию

getdate()

, которая возвращает массив, содержащий все элементы предоставленной даты / времени:

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

Если ваши начальные и конечные даты находятся в string, затем используйте

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

перед указанным выше кодом

6
ответ дан Mark Pim 20 August 2018 в 08:10
поделиться
  • 1
    похоже, не работает. Я получаю дату в начале эпохи timestamp. – Sirber 26 July 2010 в 18:34
  • 2
    Важно понимать, что вам нужно сделать $my_t["year"] -= 1970, чтобы получить правильное количество лет. Вы также должны вычесть ваш часовой разницу с GMT, чтобы получить право на часы. Вы также должны вычесть 1 из месяца и даты. – Salman A 21 February 2012 в 09:55

Я нашел вашу статью на следующей странице, которая содержит ряд ссылок для вычислений даты PHP .

Рассчитайте разницу между двумя датами (и временем) с помощью PHP , На следующей странице представлен ряд различных методов (всего 7) для выполнения расчетов даты и времени с использованием PHP, чтобы определить разницу во времени (часы, муниты), дни, месяцы или годы между двумя датами.

См. PHP Date Time - 7 методов расчета разницы между двумя датами .

15
ответ дан Peter Mortensen 20 August 2018 в 08:10
поделиться
  • 1
    Вопрос задал разницу как число лет , месяцев и дней . Это выводит разницу как общее количество дней. – Peter Mortensen 9 April 2014 в 00:40
  • 2
    Вопрос задавал разницу как количество лет, месяцев и дней, а не общее количество дней. – Peter Mortensen 9 April 2014 в 00:41

In за копейки за фунт: я только что рассмотрел несколько решений, все из которых предоставляют комплексное решение с использованием floor (), которое затем округляется до 26-летнего 12-месячного и 2-дневного решения, для чего должно было быть 25 лет, 11 месяцев и 20 дней !!!!

вот моя версия этой проблемы: может быть не изящной, может быть не очень хорошо закодирована, но обеспечивает более близкую близость к ответу, если вы этого не сделаете count LEAP лет, очевидно, високосные годы могут быть закодированы в этом, но в этом случае, как сказал кто-то другой, возможно, вы могли бы предоставить этот ответ :: Я включил все условия TEST и print_r, чтобы вы могли более четко видеть конструкцию результаты :: здесь идет,

// устанавливаем даты ввода / переменные ::

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

// Нам нужно EXPLODE формат ISO yyyy-mm-dd в yyyy mm dd, следующим образом ::

$ yDate [] = explode ('-', $ ISOstartDate); print_r ($ yDate);

$ zDate [] = explode ('-', $ 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 дней

Вот как долго я был в бизнесе 22 июня 2013 - Ой!

1
ответ дан 3 revs 20 August 2018 в 08:10
поделиться

Я предпочел бы использовать объекты 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

Для получения дополнительной информации info читать руководство date_diff PHP date_diff

Согласно руководству date_diff является псевдонимом DateTime :: diff ()

4
ответ дан Adeel 20 August 2018 в 08:10
поделиться

Легкая функция

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 years 8 months 2 days

2
ответ дан Anuj 20 August 2018 в 08:10
поделиться

Для версии 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");
3
ответ дан bikram kc 20 August 2018 в 08:10
поделиться

Очень просто:

    <?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 или выше.

2
ответ дан Choudhury Saadmaan Mahmid 20 August 2018 в 08:10
поделиться

Поскольку все отправляют образцы кода, вот еще одна версия.

Мне нужна функция для отображения различий от секунд до нескольких лет (всего одна единица). Для периодов более 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';
}
2
ответ дан ChrisV 20 August 2018 в 08:10
поделиться

DateInterval отлично, но у него есть несколько предостережений:

  1. только для PHP 5.3+ (, но это действительно не очень хорошее оправдание )
  2. поддерживает только годы, месяцы, дни, часы, минуты и секунды (без недель)
  3. он вычисляет разницу со всеми вышеуказанными + днями (вы не можете получить разницу в месяцах только)

Чтобы преодолеть это, я закодировал следующее (улучшено из @enobrev answer ):

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

Он запускает две петли ; первый относится к относительным интервалам (годам и месяцам) с помощью грубой форсировки, а второй вычисляет дополнительные абсолютные интервалы с простой арифметикой (так это быстрее):

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);
}
1
ответ дан Community 20 August 2018 в 08:10
поделиться

Я использую следующую функцию, которую я написал, когда 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);
        }
1
ответ дан Konstantin Shegunov 20 August 2018 в 08:10
поделиться
$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 ";
3
ответ дан liza 20 August 2018 в 08:10
поделиться

Вот код запуска

        $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);
1
ответ дан Mosin 20 August 2018 в 08:10
поделиться

Некоторое время назад я написал функцию 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);
}    
2
ответ дан Peter Mortensen 20 August 2018 в 08:10
поделиться
  • 1
    Этот ответ так же ошибочен, как и ответ хальдонно. Он предполагает (случай 10), что год имеет 365 дней (каждый четвертый год имеет 366 дней (кроме правил на 100 год / 400 лет для григорианского календаря)), и что месяц имеет 30 дней (примерно около 30,42 дня в непиковые годы). Даже с лучшими константами он является только правильным в среднем, не обязательно правильным для любых двух конкретных дат. – Peter Mortensen 9 April 2014 в 01:00

вы всегда можете использовать следующую функцию, которая может вернуть возраст в годах и месяцах (т. е. 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;
}
2
ответ дан Rickus Harmse 20 August 2018 в 08:10
поделиться

Вы также можете использовать следующий код для возврата date diff по раундам до $ date1 = $ duedate; // присваивать дату эхо-ответа $ date2 = date ("Y-m-d"); // текущая дата $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ lateiff = ceil (($ seconds_diff / 3600) / 24); // return in days

Если вы используете метод floor php вместо ceil, он вернет вам круглую долю вниз. Пожалуйста, проверьте разницу здесь, несколько раз, если часовой пояс промежуточных серверов отличается от часового пояса в реальном времени, в этом случае вы можете получить разные результаты, чтобы соответственно изменить условия.

3
ответ дан Rikin Adhyapak 20 August 2018 в 08:10
поделиться

У меня была такая же проблема с 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/ док / RefMan / 5,5 / о / дата и время-functions.html # function_datediff

2
ответ дан techouse 20 August 2018 в 08:10
поделиться
<?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);
?>
15
ответ дан Peter Mortensen 20 August 2018 в 08:10
поделиться
  • 1
    Вопрос задал разницу как число лет , месяцев и дней . Это выводит разницу как общее количество дней. – Peter Mortensen 9 April 2014 в 00:40
  • 2
    Вопрос задавал разницу как количество лет, месяцев и дней, а не общее количество дней. – Peter Mortensen 9 April 2014 в 00:41
15
ответ дан Peter Mortensen 31 October 2018 в 07:00
поделиться