0

Hi. I need to be able to display each day of the current month excluding Sunday in a format: month/day (eg. 11/11).

So I want the output to be:

11/11
11/12
//excludes Sunday
11/14
11/15

etc.

Does anyone know how to do this?

Thanks

6
Contributors
10
Replies
23
Views
5 Years
Discussion Span
Last Post by Adriano_1
0

Actually, I only need to know how to get the dates of all the Sundays in the month in an array.

For instance:

array('6', '13', '20', '27'); //The first Sunday of this month is on the 6th, the second on the 13th, etc

How can I do that?

0

Since I just wrote this code answering your first question:

<?php
//Create an instance of now
//This is used to determine the current month and also to calculate the first and last day of the month
$now = new DateTime( 'now', new DateTimeZone( 'America/New_York' ) );

//Create a DateTime representation of the first day of the current month based off of "now"
$start = new DateTime( $now->format('m/01/Y'), new DateTimeZone( 'America/New_York' ) );

//Create a DateTime representation of the last day of the current month based off of "now"
$end = new DateTime( $now->format('m/t/Y'), new DateTimeZone( 'America/New_York' ) );

//Define our interval (1 Day)
$interval = new DateInterval('P1D');

//Setup a DatePeriod instance to iterate between the start and end date by the interval
$period = new DatePeriod( $start, $interval, $end );

//Iterate over the DatePeriod instance
foreach( $period as $date ){

	//Make sure the day displayed is greater than or equal to today
	//Make sure the day displayed is NOT sunday.
	if( $date >= $now && $date->format('w') != 0 ){
		echo $date->format( 'l, Y-m-d H:i:s' ).PHP_EOL;
	}
}
Saturday, 2011-11-12 00:00:00
Monday, 2011-11-14 00:00:00
Tuesday, 2011-11-15 00:00:00
Wednesday, 2011-11-16 00:00:00
Thursday, 2011-11-17 00:00:00
Friday, 2011-11-18 00:00:00
Saturday, 2011-11-19 00:00:00
Monday, 2011-11-21 00:00:00
Tuesday, 2011-11-22 00:00:00
Wednesday, 2011-11-23 00:00:00
Thursday, 2011-11-24 00:00:00
Friday, 2011-11-25 00:00:00
Saturday, 2011-11-26 00:00:00
Monday, 2011-11-28 00:00:00
Tuesday, 2011-11-29 00:00:00

This is easily adapted to answer your second question as well:

//Iterate over the DatePeriod instance
foreach( $period as $date ){

	//Make sure the day displayed is ONLY sunday.
	if( $date->format('w') == 0 ){
		echo $date->format( 'l, Y-m-d H:i:s' ).PHP_EOL;
	}
}
Sunday, 2011-11-06 00:00:00
Sunday, 2011-11-13 00:00:00
Sunday, 2011-11-20 00:00:00
Sunday, 2011-11-27 00:00:00

Format the return as you see fit and store the values into an array instead of displaying them.

NOTE: This is PHP 5.3+ ONLY

0

Hello.Thank you. I tested this code to find Sundays in August, 2014. Does not print the last Sunday- 31.08.2014.

0

@dani.stanisheva, to fix it you can change this codeline:

$end      = new \DateTime( $now->format('m/t/Y'), new \DateTimeZone( 'America/Bahia' ) );

to:

$end      = new \DateTime( $now->format("m/".**cal_days_in_month(CAL_GREGORIAN,$month,$year)**."/Y **23:59:59**"), new \DateTimeZone( 'America/Bahia' ) );

Add "cal_days_in_month(CAL_GREGORIAN,$month,$year) and 23:59:59" on format method. It will include the last day.

I create this function to wrap it:

function getOccurencesDatesOf($weekday, $month, $year){
    $occurrences = array();
    $now      = new \DateTime( 'now', new \DateTimeZone( 'America/Bahia' ) );

    $start    = new \DateTime( $now->format("$month/01/$year"), new \DateTimeZone( 'America/Bahia' ) );
    $end      = new \DateTime( $now->format("$month/".cal_days_in_month(CAL_GREGORIAN,$month,$year)."/$year 23:59:59"), new \DateTimeZone( 'America/Bahia' ) );
    $interval = new \DateInterval('P1D');
    $period   = new \DatePeriod( $start, $interval, $end );

    foreach($period as $date){
        if( $date->format('w') == $weekday ){
            $occurrences[] = $date;
            echo $date->format( 'l, d/m/Y H:i:s' )."<br />";
        }
    }

    return $occurrences;
}
0

@Adriano_1

Whatever the solution, you're a year late. Please resist the temptation to necropost. Thanks.

0

@diafol independent of time, I posted a fix. If anyone ever need someone, It will find the right solution. Just as I needed. Be smart. :)

0

No Adriano, not independent of time. That's the whole point. Dead threads clutter up the top pages. Thank you.

1

Andriano_1 this question was allready solved (four years ago and not one). But are you sure you posted "a fix" ? Have you tested your own code ? You wrote:

$end      = new \DateTime( $now->format("m/".**cal_days_in_month(CAL_GREGORIAN,$month,$year)**."/Y **23:59:59**"), new \DateTimeZone( 'America/Bahia' ) );

what is this ".**" after format("m/" ?

Edited by jkon

0

Thx @jkon!

If you see the function code dont has: cal_days_in_month(CAL_GREGORIAN,$month,$year)

You are sure. ** is bold here **. When i paste it on code window i didn't pay attention. The correct code is:

$end      = new \DateTime( $now->format("m/".cal_days_in_month(CAL_GREGORIAN,$month,$year)."/Y 23:59:59"), new \DateTimeZone( 'America/Bahia' ) );

So the function is the fix. I tested on 1970 to 2099 years range, for all months and all days. You can test too.

Thx again to contribute on my necro-comment! haha

Regards,

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.