37

So I have a script that returns the number of weeks in a particular month and year. How can I take a specific day from that month and determine if it is part of week 1,2,3,4 or 5 of that month?

Joe Doyle
  • 6,363
  • 3
  • 42
  • 45
brenjt
  • 15,997
  • 13
  • 77
  • 118

30 Answers30

50

The most frustrating thing I have ever tried to get working - but here it is!

<?php

    /**
     * Returns the amount of weeks into the month a date is
     * @param $date a YYYY-MM-DD formatted date
     * @param $rollover The day on which the week rolls over
     */
    function getWeeks($date, $rollover)
    {
        $cut = substr($date, 0, 8);
        $daylen = 86400;

        $timestamp = strtotime($date);
        $first = strtotime($cut . "00");
        $elapsed = ($timestamp - $first) / $daylen;

        $weeks = 1;

        for ($i = 1; $i <= $elapsed; $i++)
        {
            $dayfind = $cut . (strlen($i) < 2 ? '0' . $i : $i);
            $daytimestamp = strtotime($dayfind);

            $day = strtolower(date("l", $daytimestamp));

            if($day == strtolower($rollover))  $weeks ++;
        }

        return $weeks;
    }


    //
    echo getWeeks("2011-06-11", "sunday"); //outputs 2, for the second week of the month
?>
Marty
  • 39,033
  • 19
  • 93
  • 162
  • 1
    WOW, Works almost perfect. I just see one issue. When I change the rollover to Saturday, it marks April 30th as the sixth week but the 29th the 5th even though they are the same weeks. The 30th is the rollover day. If I change the rollover to Sunday it does some thing similar in May for the first day. Counts May 1st as the second week instead of the first week. – brenjt May 02 '11 at 14:25
  • 1
    Hmmmm.. Damn, so close. Maybe if you added a small if statement to see if the rollover day is the first day of the month or not? I'm stumped. – Marty May 03 '11 at 00:08
  • That's exactly what I thought. I'm going to determine if the rollover is the first day or last day and make an adjustment there. I think it should work off of that. – brenjt May 03 '11 at 14:45
  • 3
    my +1 is not enough for this answer... saved my ass today! Thanks – footy Mar 10 '12 at 11:49
  • +1 for the original solution, in addition to Abhilash's fix, I'd like to pay my tribute also by suggesting using date("D") for $day and sanitizing the rollover with substr(strtolower($rollover),0,3) at the start of the function. (So 'Monday', 'mon', 'Monster' would all work as rollover for Monday) – Scott Yang Jul 24 '13 at 04:02
  • @Marty ,is it possible through mysql query ?? – Gaurav Parashar Feb 19 '15 at 07:05
  • There is something wrong, if the `$date` is **2022-07-31**! The return value in this case 6, but the month only have 5 weeks! Check with this input: `getWeeks((new \DateTime('2022-07-31'))->format('Y-m-d'), "sunday");` – danigore Jul 07 '22 at 05:10
26

Edit: so much for "single line" - needed variables to avoid recomputation with the conditional. Tossed in a default argument while I was at it.

function weekOfMonth($when = null) {
    if ($when === null) $when = time();
    $week = date('W', $when); // note that ISO weeks start on Monday
    $firstWeekOfMonth = date('W', strtotime(date('Y-m-01', $when)));
    return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}

Please note that weekOfMonth(strtotime('Oct 31, 2011')); will return 6; some rare months have 6 weeks in them, contrary to OP's expectation. January 2017 is another month with 6 ISO weeks - Sunday the 1st falls in the last year's week, since ISO weeks start on Monday.

For starshine531, to return a 0 indexed week of the month, change the return 1 + to return 0 + or return (int).

For Justin Stayton, for weeks starting on Sunday instead of Monday I would use strftime('%U' instead of date('W', as follows:

function weekOfMonth($when = null) {
    if ($when === null) $when = time();
    $week = strftime('%U', $when); // weeks start on Sunday
    $firstWeekOfMonth = strftime('%U', strtotime(date('Y-m-01', $when)));
    return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}

For this version, 2017-04-30 is now in week 6 of April, while 2017-01-31 is now in week 5.

Iiridayn
  • 1,747
  • 21
  • 43
  • 2015-12-21 returns a 4, but should return a 3. – starshine531 Oct 09 '15 at 21:18
  • @starshine531 The week in month is indexed starting at 1 instead of 0 - looking at a calendar for December 2015 with that in mind it would appear that 4 is the correct value. – Iiridayn Oct 10 '15 at 06:34
  • 1
    Keep in mind that `W` uses Monday as the start of the week, so this won't work if you use Sunday as the start of the week. – Justin Stayton May 04 '16 at 17:52
  • I'd probably use `((int) strftime("%U", $day)) - ((int) strftime("%U", strtotime(date('Y-m-01', $day)))) + 1` then, though I've not tested it extensively. – Iiridayn May 04 '16 at 20:15
  • @Iiridayn this seems to be broken suddenly, it now returns -49. Maybe something to do with 2017? – Josh Mountain Jan 09 '17 at 21:52
  • 1
    @JoshMountain yeah, `date("W", strtotime('2017-01-01))` returns `52`. I'll have to add a special check for January, since days can fall into the last week of the prior year. Can't use simple modular arithmetic due to "leap weeks" either: https://en.wikipedia.org/wiki/ISO_week_date. I'll update it in the next few days. – Iiridayn Jan 09 '17 at 22:58
13
public function getWeeks($timestamp)
{
    $maxday    = date("t",$timestamp);
    $thismonth = getdate($timestamp);
    $timeStamp = mktime(0,0,0,$thismonth['mon'],1,$thismonth['year']);    //Create time stamp of the first day from the give date.
    $startday  = date('w',$timeStamp);    //get first day of the given month
    $day = $thismonth['mday'];
    $weeks = 0;
    $week_num = 0;

    for ($i=0; $i<($maxday+$startday); $i++) {
        if(($i % 7) == 0){
            $weeks++;
        }
        if($day == ($i - $startday + 1)){
            $week_num = $weeks;
        }
      }     
    return $week_num;
}

Hello all i have been struggling for the whole day trying to figure this code out, i finally figured it out so i thought i would share it with you all.

all you need to do is put a time stamp into the function and it will return the week number back to you.

thanks

Philip csaplar
  • 379
  • 3
  • 11
6

This is a solution based on sberry's mathematical solution but using the PHP DateTime class instead.

function week_of_month($date) {
    $first_of_month = new DateObject($date->format('Y/m/1'));
    $day_of_first = $first_of_month->format('N');
    $day_of_month = $date->format('j');
    return floor(($day_of_first + $day_of_month - 1) / 7) + 1;
}
user2357112
  • 260,549
  • 28
  • 431
  • 505
Wtower
  • 18,848
  • 11
  • 103
  • 80
  • Not sure which version of PHP you're using, but mine has a DateTime class, but not a DateObject class, but changing that was easy. Also, this has to be passed a DateTime object in order to function. This function would be better if it could accept either a DateTime object or a string date. – starshine531 May 20 '15 at 22:25
6

there is a problem with this method. if the passing date (Lets say 2012/01/01 which is a Sunday) and "$rollover" day is "Sunday", then this function will return 2. where its actually is 1'st week. i think i have fixed it in following function. please add comments to make it better.

function getWeeks($date, $rollover)
{
    $cut        = substr($date, 0, 8);
    $daylen     = 86400;
    $timestamp  = strtotime($date);
    $first      = strtotime($cut . "01");   
    $elapsed    = (($timestamp - $first) / $daylen)+1;
    $i          = 1;
    $weeks      = 0;
    for($i==1; $i<=$elapsed; $i++)
    {
        $dayfind        = $cut . (strlen($i) < 2 ? '0' . $i : $i);
        $daytimestamp   = strtotime($dayfind);
        $day            = strtolower(date("l", $daytimestamp));
        if($day == strtolower($rollover))
        {
            $weeks++;  
        }
    } 
    if($weeks==0)
    {
        $weeks++; 
    }
    return $weeks;  
}
Abhilash
  • 104
  • 1
  • 5
4

Just Copy and Past the code and pass month and year.

e.g month=04 year=2013.

That's exactly what You Need.

$mm= $_REQUEST['month'];
$yy= $_REQUEST['year'];
$startdate=date($yy."-".$mm."-01") ;
$current_date=date('Y-m-t');
$ld= cal_days_in_month(CAL_GREGORIAN, $mm, $yy);
$lastday=$yy.'-'.$mm.'-'.$ld;
$start_date = date('Y-m-d', strtotime($startdate));
$end_date = date('Y-m-d', strtotime($lastday));
$end_date1 = date('Y-m-d', strtotime($lastday." + 6 days"));
$count_week=0;
$week_array = array();

for($date = $start_date; $date <= $end_date1; $date = date('Y-m-d', strtotime($date. ' + 7 days')))
{
    $getarray=getWeekDates($date, $start_date, $end_date);
echo "<br>";
$week_array[]=$getarray;
    echo "\n";
$count_week++;

}

// its give the number of week for the given month and year
echo $count_week;
//print_r($week_array);

function getWeekDates($date, $start_date, $end_date)
{
    $week =  date('W', strtotime($date));
    $year =  date('Y', strtotime($date));
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1"));
    if($from < $start_date) $from = $start_date;

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-6")); 
    if($to > $end_date) $to = $end_date;

$array1 = array(
        "ssdate" => $from,
        "eedate" => $to,
);

return $array1;

   // echo "Start Date-->".$from."End Date -->".$to;
}

for($i=0;$i<$count_week;$i++)
{   
$start= $week_array[$i]['ssdate'];
echo "--";

$week_array[$i]['eedate'];
echo "<br>";
}

OUTPUT:

week( 0 )=>2013-03-01---2013-03-02

week( 1 )=>2013-03-03---2013-03-09

week( 2 )=>2013-03-10---2013-03-16

week( 3 )=>2013-03-17---2013-03-23

week( 4 )=>2013-03-24---2013-03-30

week( 5 )=>2013-03-31---2013-03-31
brenjt
  • 15,997
  • 13
  • 77
  • 118
pratik
  • 983
  • 3
  • 13
  • 25
3

For a Monday-Sunday (ISO 8601) week (or, if you simply don't care), you can do this in one line:

function get_week_of_month($date) {
 return date('W', $date) - date('W', strtotime(date("Y-m-01", $date))) + 1;
}

(Source)

For anything else, (e.g. a Sunday-Saturday week), you just need to tweak $date inside the function:

function get_week_of_month($date) {
 $date += 86400; //For weeks starting on Sunday
 return date('W', $date) - date('W', strtotime(date("Y-m-01", $date))) + 1;
}

(Thanks to these guys/gals)

NOTE: You may run into some issues at the end of the year (e.g. around 12/31, 1/1, etc.). Read more here.

rinogo
  • 8,491
  • 12
  • 61
  • 102
  • 1
    i like this answer because it does the simplistic approach that @liridayn took, plus makes it into a function, and explains how to tweak the week start day – RozzA Nov 02 '16 at 20:55
3

I think I found an elegant solution

$time = time(); // or whenever
$week_of_the_month = ceil(date('d', $time)/7);
Mike Wright
  • 111
  • 1
  • 2
  • 1
    This will only work if you are trying to count 7 day intervals in a month, or if the month happens to start on the same day as the week does. – Iiridayn Aug 30 '13 at 13:53
  • This is the solution I was looking for however to be fair it is more about telling what number of any particular week day it is in the month rather than what week it is. – jessier3 Jun 20 '16 at 20:15
3

This is the snippet that I made to fulfill my requirements for the same. Hope this will help you.

    function getWeek($timestamp) {
     $week_year = date('W',$timestamp);
     $week = 0;//date('d',$timestamp)/7;
     $year = date('Y',$timestamp);
     $month = date('m',$timestamp);
     $day = date('d',$timestamp);
     $prev_month = date('m',$timestamp) -1;
    if($month != 1 ){
        $last_day_prev = $year."-".$prev_month."-1";
        $last_day_prev = date('t',strtotime($last_day_prev));
        $week_year_last_mon = date('W',strtotime($year."-".$prev_month."-".$last_day_prev));
        $week_year_first_this = date('W',strtotime($year."-".$month."-1"));
        if($week_year_first_this == $week_year_last_mon){
            $week_diff = 0;
        }
        else{
            $week_diff = 1;
        }
        if($week_year ==1 && $month == 12 ){
        // to handle December's last two days coming in first week of January
            $week_year = 53;
        }
        $week = $week_year-$week_year_last_mon + 1 +$week_diff;
    }
    else{
     // to handle first three days January coming in last week of December.
        $week_year_first_this = date('W',strtotime($year."-01-1"));
        if($week_year_first_this ==52 || $week_year_first_this ==53){
            if($week_year == 52 || $week_year == 53){
                $week =1;
            }
            else{
                $week = $week_year + 1;
            }
        }
        else{
            $week = $week_year;
        }
    }
    return $week;
}
nageen nayak
  • 1,262
  • 2
  • 18
  • 28
Rahul Shelke
  • 2,052
  • 4
  • 28
  • 50
2

Here comes two liner:

function getWeekOfMonth(DateTime $date) {
    $firstDayOfMonth = new DateTime($date->format('Y-m-1'));

    return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}

And Wtower's solutions doesn't work 100% properly.

Community
  • 1
  • 1
j4r3k
  • 156
  • 5
2

This is probably not a good way to do this but it's my first thought and I'm really tired.

Put all your dates into an array. The date object must have a day name (Monday). Create a method that searches the array and when ever you hit a Sunday you add 1 to a week counter. Once you find the date you're looking for return the week counter. That is the week the day falls in of the year. For the week in the month you have to reset the week counter every time you get to the last day in each month.

Trevor Arjeski
  • 2,108
  • 1
  • 24
  • 40
1

Thought I'd share my function as well. This returns an array of weeks. Every week is an array with weeks day (0..6) as key and months day (1..31) as value.

Function assumes that week starts with Sunday.

Enjoy!

function get_weeks($year, $month){

    $days_in_month = date("t", mktime(0, 0, 0, $month, 1, $year));
    $weeks_in_month = 1;
    $weeks = array();

    //loop through month
    for ($day=1; $day<=$days_in_month; $day++) {

        $week_day = date("w", mktime(0, 0, 0, $month, $day, $year));//0..6 starting sunday

        $weeks[$weeks_in_month][$week_day] = $day;

        if ($week_day == 6) {
            $weeks_in_month++;
        }

    }

    return $weeks;

}
Krabats
  • 325
  • 4
  • 12
1

My 5 cents:

/**
* calculate number of weeks in a particular month
*/
function weeksInMonth($month=null,$year=null){

    if( null==($year) ) {
        $year =  date("Y",time());  
    }

    if(null==($month)) {
        $month = date("m",time());
    }

    // find number of days in this month
    $daysInMonths =  date('t',strtotime($year.'-'.$month.'-01'));

    $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);

    $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));

    $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));

    if($monthEndingDay<$monthStartDay){

        $numOfweeks++;

    }

    return $numOfweeks;
}
XuDing
  • 1,982
  • 18
  • 27
1

I create this function, from brazil :) I hope it is useful

function weekofmonth($time) {

    $firstday       = 1;
    $lastday        = date('j',$time);
    $lastdayweek = 6; //Saturday

    $week = 1;
    for ($day=1;$day<=$lastday;$day++) {
        $timetmp = mktime(0, 0, 0, date('n',$time), $day, date('Y',$time));
        if (date('N',$timetmp) == $lastdayweek) {
            $week++;
        }
    }
    if (date('N',$time)==$lastdayweek) {
        $week--;
    }

    return $week;
}

$time = mktime(0, 0, 0, 9, 30, 2014);
echo weekofmonth($time);
1

Srahul07's solution works perfectly... If you abide by the Monday-Sunday week system! Here in 'murica, non-business folk tend to go by Sunday-Saturday being a week, so May 1, 2011 is week 1 and May 2, 2011 is still week 1.

Adding the following logic to the bottom of his function, right before it returns $week will convert this to a Sunday -> Monday system:

if (!date('w',strtotime("$year-$month-01")) && date('w',$timestamp))
    $week--;
elseif (date('w',strtotime("$year-$month-01")) && !date('w',$timestamp))
    $week++;
Eric L.
  • 3,232
  • 2
  • 22
  • 20
1

I found a easy way to determine what week of the month today is in, and it would be a small change to have it work on any other date. I'm adding my two cents in here as I think my way is much more compact then the methods listed.

$monthstart = date("N",strtotime(date("n/1/Y")));
$date =( date("j")+$monthstart ) /7;
$ddate= floor( $date );
if($ddate != date) {$ddate++;}

and $ddate contains the week number you could modify it like so

function findweek($indate)
{
  $monthstart = date("N",strtotime(date("n/1/Y",strtotime($indate))));
  $date =( date("j",strtotime($indate))+$monthstart ) /7;
  $ddate= floor( $date );
  if($ddate != $date) {$ddate++;}
  return $ddate;
}

and it would return what week of the month any date you give it is. what it does is first find the number of days from the start of the week to the first of the month. then adds that on to the current date then divides the new date by 7 and that will give you how many weeks have passed since the start of the month, including a decimal place for the part of the the current week that has passed. so what I do next is round down that number, then compare the rounded down version to the original if the two match your at the end of the week so it's already in the number. if they don't then just add one to the rounded down number and voila you have the current week number.

Kit Ramos
  • 1,533
  • 1
  • 15
  • 32
0

After alot of efoort i found the solution

<?php

function getWeeks($month,$year)
{
    $month = intval($month);        //force month to single integer if '0x'
    $suff = array('st','nd','rd','th','th','th');       //week suffixes
    $end = date('t',mktime(0,0,0,$month,1,$year));      //last date day of month: 28 - 31
    $start = date('w',mktime(0,0,0,$month,1,$year));    //1st day of month: 0 - 6 (Sun - Sat)
    $last = 7 - $start;                     //get last day date (Sat) of first week
    $noweeks = ceil((($end - ($last + 1))/7) + 1);      //total no. weeks in month
    $output = "";                       //initialize string     
    $monthlabel = str_pad($month, 2, '0', STR_PAD_LEFT);
    for($x=1;$x<$noweeks+1;$x++)
    {   
        if($x == 1)
        {
            $startdate = "$year-$monthlabel-01";
            $day = $last - 6;
        }
        else
        {
            $day = $last + 1 + (($x-2)*7);
            $day = str_pad($day, 2, '0', STR_PAD_LEFT);
            $startdate = "$year-$monthlabel-$day";
        }
        if($x == $noweeks)
        {
            $enddate = "$year-$monthlabel-$end";
        }
        else
        {
            $dayend = $day + 6;
            $dayend = str_pad($dayend, 2, '0', STR_PAD_LEFT);
            $enddate = "$year-$monthlabel-$dayend";
        }
        $j=1;
        if($j--)
        {
            $k=getTotalDate($startdate,$enddate);
            $j=1;
        }

    $output .= "Week ".$xyz." week -> Start date=$startdate End date=$enddate <br />";  
    }
    return $output;
}

if(isset($_POST) && !empty($_POST)){
    $month = $_POST['m'];
    $year = $_POST['y']; 
    echo getWeeks($month,$year);
}
?>

<form method="post">
  M:
  <input name="m" value="" />
  Y:
  <input name="y" value="" />
  <input type="submit" value="go" />
</form>
0
function get_week_of_month( $timestamp )
{
    $week_of_month = 0; 
    $month = date( 'j', $timestamp );
    $test_month = $month;
    while( $test_month == $month )
    {
        $week_of_month++;
        $timestamp = strtotime( '-1 week', $timestamp );
        $test_month = date( 'j', $timestamp );
    }
    return $week_of_month;
}
Algis
  • 51
  • 1
  • 5
  • my bad, should have used the "date()" function rather than "format()", see the updated code – Algis Jan 15 '14 at 21:01
0

I really liked @michaelc's answer. However, I got stuck on a few points. It seemed that every time Sunday rolled around, there was an offset of one. I think it has to do with what day of the week is the start of the week. In any case, here is my slight alteration to it, expanded a bit for readability:

function wom(\DateTime $date) {
    // The week of the year of the current month
    $cw = date('W', $date->getTimestamp());

    // The week of the year of the first of the given month
    $fw = date('W',strtotime(date('Y-m-01',$date->getTimeStamp())));

    // Offset
    $o = 1;

    // If it is a Saturday, offset by two.
    if( date('N',$date->getTimestamp()) == 7 ) {
        $o = 2;
    }

    return $cw -$fw + $o;
}

So if the date is Nov. 9, 2013...

$cw = 45
$fw = 44

and with the offset of 1, it correctly returns 2.

If the date is Nov. 10, 2013, $cw and $fw are the same as before, but the offset is 2, and it correctly returns 3.

Abinadi
  • 660
  • 4
  • 9
  • The poster asked for the week of the month, not the week of the year. – starshine531 Oct 09 '15 at 20:31
  • Updated with a variant `weekOfMonth` which starts on Sunday instead. Note that if you just want the week of the year with a Sunday base, `(int) strftime("%U", $time)` works just as well as anything more complex. – Iiridayn Jan 12 '17 at 06:43
0

I found this online: http://kcwebprogrammers.blogspot.de/2009/03/current-week-in-month-php.html

He has a very simple solution which seems to work fine for me.

$currentWeek = ceiling((date("d") - date("w") - 1) / 7) + 1;

So for example:

$now = strtotime("today");
$weekOfMonth = ceil((date("d", $now) - date("w", $now) - 1) / 7) + 1;
Alex
  • 421
  • 4
  • 7
0

you can use W in newer php versions. http://php.net/manual/en/function.date.php

i have used it like so:

function getWeek($date) { 
$month_start=strtotime("1 ".date('F Y',$date));
$current_date=strtotime(date('j F Y',$date));

$month_week=date("W",$month_start);
$current_week=date("W",$current_date);
return ($current_week-$month_week);

}//0 is the week of the first.
Michael Kent
  • 383
  • 3
  • 17
  • This doesn't answer the question which was asked. This gets the week of the year, but the poster asked for the week of the month. – starshine531 Oct 09 '15 at 20:24
  • Yes the function was. I then use it to minus how many weeks the first of this month is from how many weeks till today. Look at the code example from my answer for how to use the function i suggested. – Michael Kent Oct 09 '15 at 21:55
  • Ah, indeed, but alas your function produces a 1 on 2016-02-08 when it should produce a 2. – starshine531 Oct 09 '15 at 23:02
  • In the comment on the code i said it counts up from 0 so just add 1 to the result. – Michael Kent Oct 09 '15 at 23:35
0

Short and foolproof:

// Function accepts $date as a string,
// Returns the week number in which the given date falls.
// Assumed week starts on Sunday.
function wom($date) {
  $date = strtotime($date);
  $weeknoofday = date('w', $date);
  $day = date('j', $date);
  $weekofmonth = ceil(($day + (7-($weeknoofday+1))) / 7);
  return $weekofmonth;
}
// Test
foreach (range(1, 31) as $day) {
    $test_date = "2015-01-" . str_pad($day, 2, '0', STR_PAD_LEFT);
    echo "$test_date - ";
    echo wom($test_date) . "\n";
}
Kevin Siji
  • 261
  • 4
  • 10
0

I use this simple function:

function weekNumberInMonth($timestampDate)
{
    $firstDayOfMonth = strtotime(date('01-M-Y 00:00:00', $timestampDate));
    $firstWeekdayOfMonth = date( 'w', $firstDayOfMonth);
    $dayNumberInMonth = date('d', $timestampDate);
    $weekNumberInMonth = ceil(($dayNumberInMonth + $firstWeekdayOfMonth) / 7);
    return $weekNumberInMonth;
}
0

if I understand correct, the question is how to identify what number of week within a month of a specific day... I was looking for similar solution. I used some ideas of above answers to develop my own solution. Hope it can be helpful for somebody. If Yes, then UpVote my answer.

function week_number_within_month($datenew){

        $year =  date("Y",strtotime($datenew));  
        $month = date("m",strtotime($datenew));

    // find number of days in this month
    $daysInMonths =  date('t',strtotime($year.'-'.$month.'-01'));
    $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);
    $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));
    $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));
    if($monthEndingDay<$monthStartDay){
        $numOfweeks++;
    }
    $date=date('Y/m/d', strtotime($year.'-'. $month.'-01'));
    $week_array=Array();
    for ($i=1; $i<=$numOfweeks; $i++){   /// create an Array of all days of month separated by weeks as a keys
            $max = 7;
            if ($i ==1){ $max = 8 - $monthStartDay;}
            if ($i == $numOfweeks){ $max = $monthEndingDay;}
            for ($r=1; $r<=$max; $r++){

                    $week_array[$i][]=$date;
                    $date = date('Y/m/d',strtotime($date . "+1 days"));
            }
    }
    $new_datenew = date('Y/m/d', strtotime($datenew));
    $week_result='';
        foreach ($week_array as $key => $val){  /// finding what week number of my date from week_array
            foreach ($val as $kr => $value){
            if ($new_datenew == $value){
                $week_result = $key;
            } 
            }
        }
    return $week_result;
}
print week_number_within_month('2016-09-15');
Sergiu Costas
  • 530
  • 4
  • 8
  • 26
0
function getWeekOfMonth(\DateTime $date)
{
    $firstWeekdayOfMonth = new DateTime("first weekday 0 {$date->format('M')} {$date->format('Y')}");
    $offset = $firstWeekdayOfMonth->format('N')-1;
    return intval(($date->format('j') + $offset)/7)+1;
}
elier
  • 439
  • 4
  • 12
0
/**
         * In case of Week we can get the week of year. So whenever we will get the week of the month then we have to
         * subtract the until last month weeks from it will give us the current month week.
         */
        $dateComponents = getdate();

        if($dateComponents['mon'] == 1)
            $weekOfMonth = date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-'.$dateComponents['mday']))-1; // We subtract -1 to map it to the array
        else
            $weekOfMonth = date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-'.$dateComponents['mday']))-date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-01'));
Abbas
  • 763
  • 1
  • 12
  • 26
0

Using Carbon:

$date = Carbon::now(); $d1 = $date->startOfMonth(); $d2 = $date->endOfMonth();

$weeks = $d1->diffInWeeks($d2);

carlituxman
  • 1,201
  • 12
  • 22
0

If you clearly want to separate a month into 4 Weeks, you can use this function. This is helpful, if you want

  • "the first monday of month"
  • "the third thursday of month" etc.

Here we go

/**
* This Calculates (and returns) the week number within a month, based on date('j') day of month.
* This is useful, if you want to have (for instance) the first Thu in month, regardless of date
* @param $Timestamp
* @return float|int
*/
function getWeekOfMonth($Timestamp)
{
    $DayOfMonth=date('j', $Timestamp); // Day of the month without leading zeros 0-31

    if($DayOfMonth>21) return 4;
    if($DayOfMonth>14) return 3;
    if($DayOfMonth>7) return 2;
    return 1;
}
summsel
  • 78
  • 2
  • 9
0

From carbon:

return (int) ceil((new Datetime())->format('d') / 7);

As simple as possible :)

-1

Python: Number of the Week in a Month

This is a worked example in Python - should be simple to convert.

Community
  • 1
  • 1
lifeisstillgood
  • 3,265
  • 2
  • 21
  • 22