За последние 24 часа нас посетили 21714 программистов и 1020 роботов. Сейчас ищут 700 программистов ...

Помогите разбораться с периудом

Тема в разделе "Прочие вопросы по PHP", создана пользователем din, 18 апр 2022.

  1. din

    din Новичок

    С нами с:
    18 апр 2022
    Сообщения:
    2
    Симпатии:
    0
    работаю над периодичностью в календаре, с ежедневно или еженедельно проблем нет, но когда хочу использовать P1M или P1Y то из за того что нет в календаре есть дни от 28 до 31 происходит смещение и я не совсем понимаю как это обойти
    вот мой код
    Код (Text):
    1.  
    2. $from = new \DateTime('2022-01-31 10:00:00');
    3. $to = new \DateTime('2024-02-31 10:00:00');
    4. $period = new \DatePeriod($from, new \DateInterval('P1M'), $to);
    5.             $arrayOfDates = array_map(
    6.                 function ($item) {
    7.                     return $item->format('Y-m-d H:i:s');
    8.                 },
    9.                 iterator_to_array($period)
    10.             );
    вывод
    array:25 [
    0 => "2022-01-31 10:00:00"
    1 => "2022-03-03 10:00:00"
    2 => "2022-04-03 10:00:00"
    3 => "2022-05-03 10:00:00"
    4 => "2022-06-03 10:00:00"
    5 => "2022-07-03 10:00:00"
    6 => "2022-08-03 10:00:00"
    7 => "2022-09-03 10:00:00"
    8 => "2022-10-03 10:00:00"
    9 => "2022-11-03 10:00:00"
    10 => "2022-12-03 10:00:00"
    11 => "2023-01-03 10:00:00"
    12 => "2023-02-03 10:00:00"
    13 => "2023-03-03 10:00:00"
    14 => "2023-04-03 10:00:00"
    15 => "2023-05-03 10:00:00"
    16 => "2023-06-03 10:00:00"
    17 => "2023-07-03 10:00:00"
    18 => "2023-08-03 10:00:00"
    19 => "2023-09-03 10:00:00"
    20 => "2023-10-03 10:00:00"
    21 => "2023-11-03 10:00:00"
    22 => "2023-12-03 10:00:00"
    23 => "2024-01-03 10:00:00"
    24 => "2024-02-03 10:00:00"
    ]
    зачем то в феврале из за того что то 28 то 29 сбивает порядок добавление одного месяца и
    получаю такой массив, а хотелось бы только те месяца в котором есть 31число
    проблемы только датами 28,29,30,31 в остальном меня все устраивает.
    я новичек в php, помогите кто в этом шарит хорошо)
     
    #1 din, 18 апр 2022
    Последнее редактирование: 18 апр 2022
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    "зачем-то" — очевидно затем что месяц февраль нерезиновый? чтобы после февраля следующие месяцы не отсчитывались от вынужденной даты, всякий раз прибавляй интервал к исходной дате, т.е. x +1 месяц, x + 2 месяца и т.д.
    --- Добавлено ---
    тогда последовательность будет типа

    2022-01-31 10:00:00
    2022-03-31 10:00:00
    2022-05-01 10:00:00
    2022-05-31 10:00:00
    2022-07-01 10:00:00
    ...
     
  3. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    69
    Симпатии:
    20
    В библиотеке Carbon эта проблема решена.
    PHP:
    1. $date->addMonthsNoOverflow(...)
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    @brevis хорошая ссылка. но это не решение проблемы, точнее это возможно решение побочной проблемы, а не основной.

    есть непреодолимое обстоятельство — февраль короткий месяц ))) мы можем получить очередной скорректированный результат или 28е число (иногда 29е) или какой-то день в марте. выбор за заказчиком.

    главная беда это что скорректированная дата у автора темы портит все последующие вычисления. это решается алгоритмически, через вычисленияе всех дат от исходной даты, а не от предыдущей вычисленной.
     
  5. din

    din Новичок

    С нами с:
    18 апр 2022
    Сообщения:
    2
    Симпатии:
    0
    Вроде как боле менее разобрался, можете подсказать функцию которая в зависимости от даты узнает кол. дней в след месяце, пробовал много процедур но все оказались не рабочими
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям