Вы знаете, в чем проблема, глядя на код?
Я был бы рад, если бы вы помогли мне:
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
$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"; }
$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: извините, у меня был прирост в неправильном месте.