Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: разбить период дат , на подпериоды по месяцам
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » разбить период дат , на подпериоды по месяцам

Страниц (1): [1]
 

1. lashuk - 27 Ноября, 2014 - 11:37:50 - перейти к сообщению
Доброго времени суток.

Есть начальная дата 2014-01-16 и допустим есть конечная дата 2014-03-24

Мне надо из этих двух дат т.е. от 2014-01-16 и до 2014-03-24 разбить по месяцам. примерно, то что надо получить

(2014-01-16 | 2014-01-31)
(2014-02-01 | 2014-02-28)
(2014-03-01 | 2011-03-24) .

Заранее благодарен.
2. Мелкий - 27 Ноября, 2014 - 12:29:31 - перейти к сообщению
В принципе, этим занимается штатный класс DatePeriod http://php.net/manual/en/class.dateperiod.php

Но порой он работает не так, как ожидается, я предпочитаю такие задачи итерировать как-то так:
PHP:
скопировать код в буфер обмена
  1. $rFrom = new \datetime('2013-01-29');
  2. $rTill = new \datetime('2014-03-24');
  3. for ($rMonth = clone $rFrom; $rMonth <= $rTill; $rMonth->modify('first day of next month')) {
  4.         echo $rMonth->format('Y-m-d'),' - ', $rMonth->format('Y-m-t'),PHP_EOL;
  5.         }
3. lashuk - 27 Ноября, 2014 - 18:50:10 - перейти к сообщению
Проблема в том, что этот код должен первый подпериод начать с даты 2013-01-29-2013-01-31,в середине должны быть полные месяцы с 1 числа по 31 и конечный подпериод должен начаться с 2014-03-01 а закончиться указанной датой в полном периоде т.е 2014-03-24.
4. Sail - 27 Ноября, 2014 - 19:24:39 - перейти к сообщению
lashuk пишет:
Проблема в том, что этот код должен первый подпериод начать с даты 2013-01-29-2013-01-31,в середине должны быть полные месяцы с 1 числа по 31 и конечный подпериод должен начаться с 2014-03-01 а закончиться указанной датой в полном периоде т.е 2014-03-24.

Разве-ж это проблема?
Например, можно так модифицировать вышеприведённый код:
PHP:
скопировать код в буфер обмена
  1.     $rFrom = new \datetime('2013-01-29');
  2.     $rTill = new \datetime('2014-03-24');
  3.     for ($rMonth = clone $rFrom; $rMonth <= $rTill; $rMonth->modify('first day of next month')) {
  4.             echo $rMonth->format('Y-m-d'),' - ', min($rTill->format('Y-m-d'), $rMonth->format('Y-m-t')),PHP_EOL;
  5.             }
5. lashuk - 27 Ноября, 2014 - 19:41:49 - перейти к сообщению
Всем спасибо, очень помогло

 

Powered by ExBB FM 1.0 RC1