Вычитание двух дат в php

У меня есть две даты в php

$date1 = 'May 3, 2012 10:38:22 GMT' $date2 = '06 Apr 2012 07:22:21 GMT' 

Тогда я вычитаю их обоих

 $date2 - $date1 

, и получить

 Result:6 

Почему результат 6, а не 27? …? Как я могу вычесть две даты и заставить ее вернуть мне результат, основанный на различиях по месяцам, вычитая годы & дни и время?

Solutions Collecting From Web of "Вычитание двух дат в php"

Часть 1: Почему результат 6?

Даты – это просто строки, когда вы сначала их вычитаете. PHP пытается преобразовать их в целые числа. Он делает это путем преобразования до первого не номера. Итак, date2 становится 6, а date1 становится 0.

Часть 2: Как вы можете заставить его работать?

 $datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); $secs = $datetime2 - $datetime1;// == <seconds between the two times> $days = $secs / 86400; 

Преобразуйте соответственно.

Существует один способ использования mktime n сделать дату в timestamp, а затем вычесть, а затем использовать функцию даты, чтобы показать, как вы хотите ….

Другим способом является формат обоих дат в том же формате, что и вычесть ….

Третий путь

 $date1= new DateTime("May 3, 2012 10:38:22 GMT"); $date2= new DateTime("06 Apr 2012 07:22:21 GMT"); echo $date1->diff($date2)->("%d"); 

четвертый путь

 $datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); $secs = $datetime2 - $datetime1;// == return sec in difference $days = $secs / 86400; 

Используя DateTime и DataInterval ,

 $date1= new DateTime("May 3, 2012 10:38:22 GMT"); $date2= new DateTime("06 Apr 2012 07:22:21 GMT"); echo $date1->diff($date2)->format("%d"); 
 $todate= strtotime('May 3, 2012 10:38:22 GMT'); $fromdate= strtotime('06 Apr 2012 07:22:21 GMT'); $calculate_seconds = $todate- $fromdate; // Number of seconds between the two dates $days = floor($calculate_seconds / (24 * 60 * 60 )); // convert to days echo($days); 

Этот код найдет разницу дат между двумя датами.

Здесь вывод 27

Большинство представленных решений, похоже, работают, но каждый забывает об одном: время.

Пример Эвана :

 $datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); $secs = $datetime2 - $datetime1;// == <seconds between the two times> $days = $secs / 86400; 

Когда вы не урезаете временную часть, что может привести к перепланированию. Например: Интервал между 2014-05-01 14:00:00 (Ymd) и 2014-05-02 07:00:00 будет 0, xxx, а не 1. Вы должны урезать временную часть каждой даты.

Так должно быть:

 $datetime1 = strtotime(date('Ym-d', strtotime('May 3, 2012 10:38:22 GMT'))); $datetime2 = strtotime(date('Ym-d', strtotime('06 Apr 2012 07:22:21 GMT'))); $secs = $datetime2 - $datetime1;// == <seconds between the two times> $days = $secs / 86400; 
 echo 'time'.$notification_time= "2008-12-13 10:42:00"; date_default_timezone_set('Asia/Kolkata'); echo 'cureen'.$currenttime=date('Ymd H:i:s'); $now = new DateTime("$notification_time"); $ref = new DateTime("$currenttime"); $diff = $now->diff($ref); printf('%d days, %d hours, %d minutes', $diff->d, $diff->h, $diff->i); 

Если вы хотите использовать метод diff (он возвращает объект Dateinterval), правильный способ – форматировать с помощью% a. Я имею в виду:

Если вы проверите http://php.net/manual/en/dateinterval.format.php

Правильный способ:

  echo $date1->diff($date2)->format("%a"); 

За все дни