Не удается найти функцию, которая динамически возвращает массив недельных дат относительно сегодняшнего дня - PullRequest
0 голосов
/ 25 февраля 2019

, как сказал заголовок, я гуглял, но понятия не имел.

вот в чем дело, скажем, у меня есть функция, которая принимает целочисленный параметр.когда я вызываю его, то есть scoutWeekly(1), в нем указывается первая неделя этого месяца (28 января - 3 февраля).Если я даю параметр 2 функции, в нем указывается вторая неделя этого месяца (04 февраля-10 февраля).и так далее ... все должно относиться к этому дню, например, если он вызван scoutWeekly(1), он переходит на (28 января-3 февраля)

У вас есть какие-нибудь подсказки или фрагмент?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Есть более простой способ ...

function scoutWeekly($n) {
    // today's date
    $today = new DateTime();
    // set to first day of the month
    $today->setDate($today->format('Y'), $today->format('m'), 1);
    // get the Monday earlier
    $today->sub(new DateInterval('P' . ($today->format('N') - 1) . 'D'));
    // add the required number of weeks
    if ($n > 1) {
        $today->add(new DateInterval('P' . ($n - 1) . 'W'));
    }
    // and format the result
    return $today->format('d M') . '-' . $today->add(new DateInterval('P6D'))->format('d M');
}
echo scoutWeekly(1)

Вывод:

28 Jan-03 Feb

Демонстрация на 3v4l.org

0 голосов
/ 25 февраля 2019

Я ОП

это решенный ответ:

    private static function addScoutWeek(int $addNumb = null) : array
    {
        $addStart = Carbon::now()->startOfMonth()->addWeek($addNumb)->startOfWeek();
        $interval = new \DateInterval('P1D');
        $addEnd = Carbon::now()->startOfMonth()->addWeek($addNumb)->endOfWeek();
        $dateRange = new \DatePeriod($addStart, $interval, $addEnd);

        foreach ($dateRange as $date) {
            $arrOfDate[] = $date;
        }

        return $arrOfDate;
    }

дело закрыто

0 голосов
/ 25 февраля 2019
function weeks($month, $year)
{
    $num_of_days = date("t", mktime(0, 0, 0, $month, 1, $year));
    $lastday     = date("t", mktime(0, 0, 0, $month, 1, $year));
    $no_of_weeks = 0;
    $count_weeks = 0;
    while ($no_of_weeks < $lastday)
    {
        $no_of_weeks += 7;
        $count_weeks++;
    }
    return $count_weeks;
}

function getRangeByWeek($weekNo)
{
    $firstDayOfCurrentMonth = date('Y-m-01');
    $globalWeek             = intval(date('W', strtotime($firstDayOfCurrentMonth)));
    $globalYear             = intval(date('Y', strtotime($firstDayOfCurrentMonth)));
    $globalMonth            = intval(date('m', strtotime($firstDayOfCurrentMonth)));
    $totalNumberOfWeeks     = weeks($globalMonth, $globalYear);
    $date                   = new DateTime();
    $result                 = [];
    for ($i = 1; $i <= $totalNumberOfWeeks; $i++)
    {
        $startDate  = $date->setISODate($globalYear, $globalWeek)->format("d M");
        $endDate    = $date->setISODate($globalYear, $globalWeek, 7)->format("d M");
        $result[$i] = $startDate . '-' . $endDate;
        $globalWeek++;
    }
    return $result[$weekNo];
}
echo getRangeByWeek(1);
  1. Извлеченная глобальная неделя с первого дня текущего месяца и требуемый год и месяц
  2. Взял общее количество недель в текущем месяце
  3. Создан пустой экземпляр DateTime для выполненияпростое вычисление и получение первой даты глобальной недели
  4. Увеличение глобальных недель до общего числа недель в текущем месяце
  5. независимо от того, какой результат был сгенерирован, я сохранял индекс как номер недели текущего месяца
  6. возвращаемый диапазон дат текущего номера недели текущего месяца

Вывод

28 Jan-03 Feb

Демо

...