Среда, 24 Октябрь 2012 00:00

Как правильно организовать цикл по датам

Автор 
Оцените материал
(5 голосов)

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

Просмотрев с десяток ссылок, которые мне предложил google по моему запросу, я не заметил особой разницы в предложенных решениях. Вот примерный код того, что мне удалось найти:

<?php

$date_begin = '2012-10-01';
$date_end = '2012-10-05';

$date = $date_begin;
while($date <= $date_end){
    echo $date.'<br />';
    $date = date('Y-m-d', strtotime($date) + 86400); // где 86400 - количество секунд в одном дне (24*60*60)
}

?>

У вас может возникнуть вопрос — а что здесь неправильного? Более того, я с вами даже соглашусь — этот код вернет вам то, что вы желаете увидеть:

2012-10-01
2012-10-02
2012-10-03
2012-10-04
2012-10-05

Но если немного изменить период, допустим так:

$date_begin = '2012-10-25';
$date_end = '2012-10-31';

Тех, кто попытается испробовать данный код с измененным периодом, могу предупредить — готовьтесь перезапускать свой браузер :)

Давайте не будем доверять while'у и заменим цикл на for:

<?php

$date = $date_begin;
for($i=1; $i<=7; $i++){
    echo $date.'<br />';
    $date = date('Y-m-d', strtotime($date) + 86400);
}

?>

Результат (а вот здесь самое интересное):

2012-10-25
2012-10-26
2012-10-27
2012-10-28
2012-10-28
2012-10-28
2012-10-28

В чем же проблема?

Давайте несколько изменим формат нашей даты — добавим к нему время:

<?php

$date_begin = '2012-10-25 00:00:00';
$date_end = '2012-10-31 00:00:00';

$date = $date_begin;
for($i=1; $i<=7; $i++){
    echo $date.'<br />';
    $date = date('Y-m-d H:i:s', strtotime($date) + 86400);
}

?>

Посмотрим результат:

2012-10-25 00:00:00
2012-10-26 00:00:00
2012-10-27 00:00:00
2012-10-28 00:00:00
2012-10-28 23:00:00
2012-10-29 23:00:00
2012-10-30 23:00:00

Нет, это не ошибка в тексте, можете проверить сами — если к 28 октября 2012 года 00 часов 00 минут 00 секунд добавить 24 часа, то вы получите 28 октября 2012 года 23 часа 00 часов 00 минут. А знаете почему? Потому что 28 октября 2012 года в сутках не 24, а 25 часов за счет перехода на зимнее время (последнее воскресенье октября).

 

А теперь то, ради чего писалась эта статья — как это исправить? А очень просто! Если вы хотите, чтобы ваш цикл работал правильно всегда (а не только за исключением одного месяца в году), используя данное решение, задавайте начальное время периода где-то в середине дня, чтобы +/- один час никак на него не повлиял. И, кстати, теперь вы смело можете использовать while, даже не задумываясь, сколько итераций вам нужно поставить для вашего цикла:

<?php

$date_begin = '2012-10-25 12:00:00';
$date_end = '2012-10-31 12:00:00';

$date = $date_begin;
while($date <= $date_end){
    echo $date.'<br />';
    $date = date('Y-m-d H:i:s', strtotime($date) + 86400);
}

?>
2012-10-25 12:00:00
2012-10-26 12:00:00
2012-10-27 12:00:00
2012-10-28 11:00:00
2012-10-29 11:00:00
2012-10-30 11:00:00
2012-10-31 11:00:00

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

<?php

$date_begin = '2012-10-25';
$date_end = '2012-10-31';

$date = $date_begin;
while($date <= $date_end){
    echo $date.'<br />';
    $date = date('Y-m-d', strtotime($date.' + 1 days'));
}

?>

Плюсы использования операции '+ 1 days' очевидны — вам не нужно помнить о переходе на зимнее время, не нужно использовать часы, если вы работаете только с датой. Вы просто добавляете один день и получаете желаемый результат:

2012-10-25
2012-10-26
2012-10-27
2012-10-28
2012-10-29
2012-10-30
2012-10-31
Последнее изменение Пятница, 17 Октябрь 2014 14:56

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены

Подать запрос

Если Вам нужна еще информация, заполните, пожалуйста, этот формуляр.Мы свяжемся с Вами немедленно.
*Обязательные поля

Почему клиенты выбирают именно нас?

  • Отправка запроса и создание предложения у нас бесплатны
  • Мы ценим Ваши персональные данные
  • Соответствие цены и качества услуг
  • Наши консультации основываются на многолетнем опыте
  • Прозрачный процес работы над проектом и открытая коммуникация
  • Качественные услуги на основе современных технологий
  • Длительная поддержка