php дней между двумя датами

Вы знаете, в чем проблема, глядя на код?

Я был бы рад, если бы вы помогли мне:

list($from_day,$from_month,$from_year) = explode(".","27.09.2012"); list($until_day,$until_month,$until_year) = explode(".","31.10.2012"); $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year); $iDateTo = mktime(0,0,0,$until_month,$until_day,$until_year); while ($iDateFrom <= $iDateTo) { print date('dmY',$iDateFrom)."<br><br>"; $iDateFrom += 86400; } 

Дата написания одной и той же проблемы 2 раза

Октябрь (31) для написания 2 раза в истории рисует концы 30 октября: (

27.09.2012

28.09.2012

26.10.2012

27.10.2012

[[28.10.2012]]

[[28.10.2012]]

29.10.2012

30.10.2012

Solutions Collecting From Web of "php дней между двумя датами"

  1. Ваша проблема в том, что вы установили время до 00:00:00, установите его в 12:00:00. Это потому, что Летнее время .
  2. Прекратите использование функции date (), используйте классы Date и Time .

Решение (PHP> = 5.4):

 $p = new DatePeriod( new DateTime('2012-09-27'), new DateInterval('P1D'), (new DateTime('2012-10-31'))->modify('+1 day') ); foreach ($p as $d) { echo $d->format('dmY') . "\n"; } 

Решение (PHP <5.4)

 $end = new DateTime('2012-10-31'); $end->modify('+1 day'); $p = new DatePeriod( new DateTime('2012-09-27'), new DateInterval('P1D'), $end ); foreach ($p as $d) { echo $d->format('dmY') . "\n"; } 

У вас есть проблемы с летним временем. Добавление секунд от одной временной метки к другой подвержено проблемам, связанным с этими типами краевых условий (возможно, проблемы с прыжками могут быть проблематичными), вы должны привыкнуть использовать объекты DateTime и DateInterval PHP. Это позволяет работать с датами.

 $start_date = new DateTime('2012-09-27'); $end_date = new DateTime('2012-10-31'); $current_date = clone $start_date; $date_interval = new DateInterval('P1D'); while ($current_date < $end_date) { // your logic here $current_date->add($date_interval); } 

Моя идея для решения этого была бы такой:

 $firstDate = "27.09.2012"; $secondDate = "31.10.2012"; $daysDifference = (strtotime($secondDate) - strtotime($firstDate)) / (60 * 60 * 24); $daysDifference = round($daysDifference); for ($i = 0; $i <= $daysDifference; $i++) { echo date("dmY", strtotime('+'.$i.' day', strtotime($firstDate))) . "<BR>"; } 

Это должно решить вашу проблему и будет намного легче читать (imho). Я только что проверил код, и он выводит все даты и не имеет удвоений. Это также избавляет вас от всех несоответствий на летнее время.

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

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

 list($from_day,$from_month,$from_year) = explode(".","27.09.2012"); list($until_day,$until_month,$until_year) = explode(".","31.10.2012"); $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year); $iDateTo = mktime(0,0,0,$until_month,$until_day,$until_year); while ($iDateFrom <= $iDateTo) { print date('dmY',$iDateFrom)."<br><br>"; $from_day = $from_day + 1; $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year); } 

Несмотря на то, что $from_day , вероятно, будет намного выше 31, mktime сделает математическое преобразование для вас. (т.е. 32 дня в 31-дневном месяце = 1-й день следующего месяца)

EDIT: извините, у меня был прирост в неправильном месте.