Количество месяцев от даты до даты php

Рассчитать количество месяцев между двумя датами в PHP?

Без использования функции date_diff PHP 5.3 (я использую PHP 5.2.17), есть ли простой и точный способ сделать это? Я думаю о чем-то вроде кода ниже, но я не знаю, как учитывать високосные годы:

$days = ceil(abs( strtotime('2000-01-25') - strtotime('2010-02-20') ) / 86400); $months = . ; 

Я пытаюсь выяснить, сколько месяцев прошло.

$date1 = '2000-01-25'; $date2 = '2010-02-20'; $ts1 = strtotime($date1); $ts2 = strtotime($date2); $year1 = date('Y', $ts1); $year2 = date('Y', $ts2); $month1 = date('m', $ts1); $month2 = date('m', $ts2); $diff = (($year2 - $year1) * 12) + ($month2 - $month1); 

Возможно, вы захотите также включить туда дни, в зависимости от того, имеете ли вы целые месяцы или нет. Надеюсь, вы поняли эту идею.

Это простой метод, который я написал в своем классе для подсчета количества месяцев, участвующих в двух заданных датах:

public function nb_mois($date1, $date2) < $begin = new DateTime( $date1 ); $end = new DateTime( $date2 ); $end = $end->modify( '+1 month' ); $interval = DateInterval::createFromDateString('1 month'); $period = new DatePeriod($begin, $interval, $end); $counter = 0; foreach($period as $dt) < $counter++; >return $counter; > 
$date1 = strtotime('2000-01-25'); $date2 = strtotime('2010-02-20'); $months = 0; while (($date1 = strtotime('+1 MONTH', $date1)) 

Если вы хотите включить дни, используйте следующее:

$date1 = strtotime('2000-01-25'); $date2 = strtotime('2010-02-20'); $months = 0; while (strtotime('+1 MONTH', $date1) < $date2) < $months++; $date1 = strtotime('+1 MONTH', $date1); >echo $months, ' month, ', ($date2 - $date1) / (60*60*24), ' days'; // 120 month, 26 days 

Мне недавно нужно было рассчитывать возраст в месяцах от пренатального до 5 лет (60+ месяцев).

Ни один из ответов выше не работал для меня. Первый, который я пробовал, который в основном представляет собой 1 лайнер для ответа на deceze

$bdate = strtotime('2011-11-04'); $edate = strtotime('2011-12-03'); $age = ((date('Y',$edate) - date('Y',$bdate)) * 12) + (date('m',$edate) - date('m',$bdate)); . . . 

Это не соответствует установленным датам, очевидно, что ответ должен быть 0, поскольку метка месяца (2011-12-04) еще не достигнута, как всегда код возвращает 1.

Второй метод, который я пробовал, используя код Адама

$bdate = strtotime('2011-01-03'); $edate = strtotime('2011-02-03'); $age = 0; while (strtotime('+1 MONTH', $bdate) < $edate) < $age++; $bdate = strtotime('+1 MONTH', $bdate); >. . . 

Это не удается и говорит 0 месяцев, когда это должно быть 1.

Что для меня работало, это небольшое расширение этого кода. Я использовал следующее:

$bdate = strtotime('2011-11-04'); $edate = strtotime('2012-01-04'); $age = 0; if($edate < $bdate) < //prenatal $age = -1; >else < //born, count months. while($bdate < $edate) < $age++; $bdate = strtotime('+1 MONTH', $bdate); if ($bdate >$edate) < $age--; >> > 

Следуйте за ответом @deceze (я ответил на его ответ). Месяц по-прежнему будет считаться в целом, даже если день первой даты не достиг дня второй даты.

Вот мое простое решение по включению дня:

$ts1=strtotime($date1); $ts2=strtotime($date2); $year1 = date('Y', $ts1); $year2 = date('Y', $ts2); $month1 = date('m', $ts1); $month2 = date('m', $ts2); $day1 = date('d', $ts1); /* I'VE ADDED THE DAY VARIABLE OF DATE1 AND DATE2 */ $day2 = date('d', $ts2); $diff = (($year2 - $year1) * 12) + ($month2 - $month1); /* IF THE DAY2 IS LESS THAN DAY1, IT WILL LESSEN THE $diff VALUE BY ONE */ if($day2

Логика заключается в том, что если день второй даты меньше дня первой даты, это уменьшит значение переменной $diff на единицу.

$d1 = new DateTime("2009-09-01"); $d2 = new DateTime("2010-09-01"); $months = 0; $d1->add(new \DateInterval('P1M')); while ($d1 add(new \DateInterval('P1M')); > print_r($months); 

моя функция для решения проблемы

function diffMonth($from, $to) < $fromYear = date("Y", strtotime($from)); $fromMonth = date("m", strtotime($from)); $toYear = date("Y", strtotime($to)); $toMonth = date("m", strtotime($to)); if ($fromYear == $toYear) < return ($toMonth-$fromMonth)+1; >else < return (12-$fromMonth)+1+$toMonth; >> 

Вот мое решение. Это только проверки лет и месяцев дат. Таким образом, если одна дата равна '31 .10.15 ', а другая – '02 .11.15', она возвращает 1 месяц.

function get_interval_in_month($from, $to)

Вот моя чистая функция для этой проблемы, которая улучшается после ответа deceze.

/** * Calculates number of months between two dates. Format can be `Ymd` or `Ym`. Day * part is ignored if given. Order of dates doesn't matter, an absolute number is * returned. * * @param string $date1 * @param string $date2 * * @return int */ function dateDiffInMonths($date1, $date2)
  • Получить дату понедельника на текущей неделе в PHP 4
  • PHP получает номер недели за месяц
  • Как получить ближайшую дату по сравнению с массивом дат в PHP
  • Как найти день недели с даты с помощью PHP?
  • Рассчитать разницу между двумя датами в часах и минутах
  • PHP Преобразование даты в «пустые» дни / часы / секунды назад
  • Добавить X дней до даты, исключая выходные
  • Как найти текущий день нет. в месяц в php
  • найти файлы, измененные между двумя датами, используя php
  • Создать диапазон дат за последние 2 недели?
  • Изменить формат даты на голландский язык
  • Рассчитать количество рабочих дней в месяц

Источник

Как определять количество лет, месяцев, дней между датами?

Подскажите, как определять сколько прошло времени(лет, месяцев, дней) между двумя датами. Допустим есть первая дата - 2016.08.16 и вторая - 2010.03.15. Между ними нужно определить период.

Как посчитать количество дней между датами?
У меня возник такой вопрос как можно пасчитать количество дней между датами. Вот у меня есть.

Количество лет, месяцев, дней между датами
Здравствуйте. Может подскажите как вывести количество лет месяцев дней между двумя датами? спасибо.

Возврат кол-ва лет, месяцев, дней, часов, минут, секунд между датами
Нужно написать функцию которая возвращает в виде символьной строки количество лет, месяцев, дней.

$firstDate = '2016.08.16'; $secondDate = '2010.03.15'; $firstDateTimeObject = new DateTime($firstDate); $secondDateTimeObject = new DateTime($secondDate); $delta = $secondDateTimeObject->diff($firstDateTimeObject); echo $delta->format('y'); // года echo $delta->format('m'); // месяца echo $delta->format('d'); // дни

Только ошибка:
Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct() [datetime.--construct]: Failed to parse time string (2016.08.16) at position 5 (0): Double time specification' in C:\OpenServer\domains\mysite.local\vkdate.php:5 Stack trace: #0 C:\OpenServer\domains\mysite.local\vkdate.php(5): DateTime->__construct('2016.08.16') #1 thrown in C:\OpenServer\domains\mysite.local\vkdate.php on line 5

$firstDateTimeObject = DateTime::createFromFormat('Y.m.d', $firstDate); $secondDateTimeObject = DateTime::createFromFormat('Y.m.d', $secondDate);
echo $delta->format('%y'); // года echo $delta->format('%m'); // месяца echo $delta->format(%'d'); // дни
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 $t = "2006-09-23T20:27:12+03:00"; $d = strtotime(date("Y", strtotime($t)).'-'.date("n", strtotime($t)).'-'.date("d", strtotime($t))); $days = floor((strtotime(date("Y-m-d")) - $d) / 86400); echo $days; //возвращает 3615(так и должно быть) $firstDate = date("Y-m-d"); $secondDate = $d; //сюда надо как то вставить $d, убрав что-то из переменной, но так чтобы результат $days не изменился $firstDateTimeObject = DateTime::createFromFormat('Y-m-d', $firstDate); $secondDateTimeObject = DateTime::createFromFormat('Y-m-d', $secondDate); $delta = $secondDateTimeObject->diff($firstDateTimeObject); echo $delta->format('%y')."лет 
"
; // года echo $delta->format('%m')."месяцев
"
; // месяца echo $delta->format('%d')."дней
"
; // дни ?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 $t = "2006-09-23T20:27:12+03:00"; $d = date("Y", strtotime($t)).'-'.date("n", strtotime($t)).'-'.date("d", strtotime($t)); $days = floor((strtotime(date("Y-m-d")) - strtotime($d)) / 86400); echo $days; //возвращает 3615(так и должно быть) $firstDate = date("Y-m-d"); $secondDate = $d; $firstDateTimeObject = DateTime::createFromFormat('Y-m-d', $firstDate); $secondDateTimeObject = DateTime::createFromFormat('Y-m-d', $secondDate); $delta = $secondDateTimeObject->diff($firstDateTimeObject); echo $delta->format('%y')."лет 
"
; // года echo $delta->format('%m')."месяцев
"
; // месяца echo $delta->format('%d')."дней
"
; // дни

Вычислить количество месяцев и дней между датами
В общем-то не охота писать такой код самому. Как уже имеющими средствами (тем же DateTime).

Рассчитать количество месяцев и дней между двумя датами
Нужна ваша помощь. Необходимо расчитать количество месяц и дней или только количество дней между.

Количество месяцев и дней между двумя датами в четырех ячейках
Помогите пожалуйста переделать макрос. Нужно что бы работал с 1-го по 20-й листы, Данные.

Количество месяцев и дней между двумя датами в четырех ячейках
Помогите пожалуйста переделать макрос. Нужно что бы работал с 1-го по 20-й листы, Данные.

Источник

Рассчитать количество месяцев между двумя датами в PHP?

Без использования PHP 5.3 функция date_diff (я использую PHP 5.2.17), есть ли простой и точный способ сделать это? Я думаю о чем-то вроде кода ниже, но я не знаю, как учитывать високосные годы:

$days = ceil(abs( strtotime('2000-01-25') - strtotime('2010-02-20') ) / 86400); $months = . ; 

По какой причине вам не понравилось решение на php.net? php.net/manual/en/datetime.diff.php#107434 этот

Что именно вы имеете в виду под количеством месяцев? Какая разница месяцев между 5 октября и 3 ноября того же года? А как насчет 31 октября и 1 ноября?

Подсчитайте количество лет, умножьте его на 12, вычтите начальный месяц из последнего месяца, затем сделайте то же самое с днями. -адить- или делать то, что предложила децез;)

Спасибо всем, я обновил вопрос сейчас, который должен ответить на ваши вопросы. @NappingRabbit, это очень долго!

11 ответов

$date1 = '2000-01-25'; $date2 = '2010-02-20'; $ts1 = strtotime($date1); $ts2 = strtotime($date2); $year1 = date('Y', $ts1); $year2 = date('Y', $ts2); $month1 = date('m', $ts1); $month2 = date('m', $ts2); $diff = (($year2 - $year1) * 12) + ($month2 - $month1); 

Возможно, вы захотите также включить туда дни, в зависимости от того, имеете ли вы целые месяцы или нет. Надеюсь, вы поняли эту идею.

Большое спасибо @deceze, выглядит хорошо! Как вы предлагаете, он должен учитывать дни, чтобы быть точным для возраста людей. Можете ли вы предложить, как это сделать?

На самом деле этот подход работает лучше, чем другие. Например, date_diff() создает date_diff() «7 месяцев и 30 дней» между 2009-09-01 и 2010-05-01 то время как это решение всегда выдает «8 месяцев».

Это простой метод, который я написал в своем классе для подсчета количества месяцев, участвующих в двух датах:

public function nb_mois($date1, $date2) < $begin = new DateTime( $date1 ); $end = new DateTime( $date2 ); $end = $end->modify( '+1 month' ); $interval = DateInterval::createFromDateString('1 month'); $period = new DatePeriod($begin, $interval, $end); $counter = 0; foreach($period as $dt) < $counter++; >return $counter; > 
$date1 = strtotime('2000-01-25'); $date2 = strtotime('2010-02-20'); $months = 0; while (($date1 = strtotime('+1 MONTH', $date1))  

Если вы хотите включить дни, то используйте это:

$date1 = strtotime('2000-01-25'); $date2 = strtotime('2010-02-20'); $months = 0; while (strtotime('+1 MONTH', $date1) < $date2) < $months++; $date1 = strtotime('+1 MONTH', $date1); >echo $months, ' month, ', ($date2 - $date1) / (60*60*24), ' days'; // 120 month, 26 days 

Это скажет вам, что между 2012-01-01 и 2012-02-01 есть два месяца. Даже если вы измените <= на <, это даст два месяца для промежутка времени январь-1 ->февраль-2, что может быть не лучшим решением.

Используя указанные вами даты, я возвращаю 1, потому что он обновляет $ date1, прежде чем проверяет, меньше ли он, и добавляет месяц.

Все, кто использует это, позаботятся об операторе while с некоторым ограничивающим значением для его итерации. Я не говорю, что если код неправильный, он просто безопасен с предосторожностями с помощью итеративных операторов.

Мне недавно нужно было рассчитывать возраст в месяцах от пренатального до 5 лет (60 + месяцев).

Ни один из ответов выше не работал у меня. Первый, который я пробовал, который в основном представляет собой 1 лайнер для ответа на deceze

$bdate = strtotime('2011-11-04'); $edate = strtotime('2011-12-03'); $age = ((date('Y',$edate) - date('Y',$bdate)) * 12) + (date('m',$edate) - date('m',$bdate)); . . . 

Это не удается с установленными датами, очевидно, что ответ должен быть 0, поскольку метка месяца (2011-12-04) еще не достигнута, как всегда код возвращает 1.

Второй метод, который я пробовал, используя код Адама

$bdate = strtotime('2011-01-03'); $edate = strtotime('2011-02-03'); $age = 0; while (strtotime('+1 MONTH', $bdate) < $edate) < $age++; $bdate = strtotime('+1 MONTH', $bdate); >. . . 

Это не работает и говорит 0 месяцев, когда это должно быть 1.

Что для меня работало, это небольшое расширение этого кода. Я использовал следующее:

$bdate = strtotime('2011-11-04'); $edate = strtotime('2012-01-04'); $age = 0; if($edate < $bdate) < //prenatal $age = -1; >else < //born, count months. while($bdate < $edate) < $age++; $bdate = strtotime('+1 MONTH', $bdate); if ($bdate >$edate) < $age--; >> > 

Источник

Читайте также:  Css style for html form
Оцените статью