Вземане на № седмица за избран месец

C++ JAVA
Post Reply
User avatar
Ticketa
Турист
Турист
Posts: 594
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Вземане на № седмица за избран месец

Post by Ticketa » Thu Feb 20, 2020 8:07 pm

Привет,
опитвам се да извадя за всеки месец в табличен вид № на седмицата , обаче функцията ми , която използвам е доста голяма (търся по кратък вариант)

Code: Select all

function getFullWeeksOfMonth($iYear, $iMonth, $sFirstDayOfWeek = 'Sunday', $bExclusive = true)
{
    $iYear           = filter_var($iYear, FILTER_VALIDATE_INT, array(
        'options' => array(
            'default' => (int) date('Y')
        )
    ));
    $iMonth          = filter_var($iMonth, FILTER_VALIDATE_REGEXP, array(
        'options' => array(
            'default' => (int) date('m'),
            'regexp' => '/^([1-9]|1[012])$/'
        )
    ));
    $aDay            = array(
        'monday' => 1,
        'sunday' => 1
    );
    $sFirstDayOfWeek = filter_var($sFirstDayOfWeek, FILTER_VALIDATE_REGEXP, array(
        'options' => array(
            'default' => 'sunday', //Set default week
            'regexp' => '/^monday|sunday$/'
        )
    ));
    $bExclusive      = filter_var($bExclusive, FILTER_VALIDATE_BOOLEAN);
    $oStart          = new DateTime($iYear . '-' . $iMonth . '-01');

    if ($bExclusive === true || ($bExclusive === false && isset($aDay[strtolower($oStart->format('l'))]))) {
        if ((int) $oStart->format('d') === 1) {
            $oStart->modify('-1 day');
        }
        $oStart->modify('first ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i'));
    } else {
        $oStart->modify('last ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i'));
    }

    $oEnd = clone ($oStart);
    if ((int) $oStart->format('m') === $iMonth) {
        $oEnd->modify('last day of this month');
    } else {
        $oEnd->modify('last day of next month');
    }

    $oInterval  = new DateInterval('P1W7D');
    $oDaterange = new DatePeriod($oStart, $oInterval, $oEnd);

    $aDate = array();
    $i     = 1;
    foreach ($oDaterange as $oDate) {
        $oTestDate    = clone $oDate;
        $oLastWeekDay = $oTestDate->modify('+6 days');
        if (((int) $oDate->format('m') === (int) $iMonth || (int) $oLastWeekDay->format('m') === (int) $iMonth) && (($bExclusive === true && (int) $oLastWeekDay->format('m') === (int) $iMonth) || ($bExclusive === false))) {
            $aDate[$i]['First'] = 'W№'.$oDate->format('W').' | '.$oDate->format('Y-m-d') ;
            $aDate[$i]['Last']  = $oLastWeekDay->format('Y-m-d');
        }
        $i++;
    }
    return $aDate;
}

echo "<pre>";

print_r(getFullWeeksOfMonth(2020, 2, 'Monday'));

echo "<pre>";
Array
(
[1] => Array
(
[First] => W№05 | 2020-02-02
[Last] => 2020-02-08
)

[2] => Array
(
[First] => W№06 | 2020-02-09
[Last] => 2020-02-15
)

[3] => Array
(
[First] => W№07 | 2020-02-16
[Last] => 2020-02-22
)

[4] => Array
(
[First] => W№08 | 2020-02-23
[Last] => 2020-02-29
)

)

Fakeheal
Гуру
Гуру
Posts: 2717
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Re: Вземане на № седмица за избран месец

Post by Fakeheal » Fri Feb 21, 2020 9:50 am

А в твоя output защо липсва 1-ви и 2-ри Февруари?

User avatar
Ticketa
Турист
Турист
Posts: 594
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Re: Вземане на № седмица за избран месец

Post by Ticketa » Fri Feb 21, 2020 9:55 am

Fakeheal wrote:
Fri Feb 21, 2020 9:50 am
А в твоя output защо липсва 1-ви и 2-ри Февруари?
Това и аз се питам хахахахах (вероятно защото почвам броенето от всеки понеделник т.е. началото на седмицата)

Fakeheal
Гуру
Гуру
Posts: 2717
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Re: Вземане на № седмица за избран месец

Post by Fakeheal » Fri Feb 21, 2020 10:06 am

Code: Select all

<?php

function myFunction($year, $month, $dateFormat) {
	$start = new DateTimeImmutable($year . '-' . $month . '-1');
	$end = $start->modify('last day of this month');

	$oneDayInterval  = new DateInterval('P1D');
	$days = new DatePeriod($start, $oneDayInterval, $end);

	$weeks = [];

	foreach($days as $day) {
		$week = $day->format('W');

		if(!isset($weeks[$week])) {
			$monday = $day->modify('monday this week')->format($dateFormat);
			$sunday = $day->modify('sunday this week')->format($dateFormat);
			$weeks[$week] = compact('week', 'monday', 'sunday');
		}
	}

    return $weeks;
}

var_dump(myFunction(2020, 2, 'Y-m-d'));
Пробвах с интервал P1W, но ако месеца започва събота/неделя не включва последните дни, т.к $end < началото на седмицата +1 седмица, ако някой се включи и измисли по-Ентелегентен начин, вместо да се "обикалят" всичките дни, ще е супер :)

Post Reply