0

I'm trying to get the last Sunday between two week numbers - in order to avoid DST.

IN ORDER WORDS: Start a range of time - from the last Sunday in March to the last Sunday in October.

This is my code:

   $heloo = gmdate('U');
   if ( (date("W", $heloo) >= 12) 
       && (date("W", $heloo) <= 43)
       && (date("N", $heloo) == 7) ) {
    echo "YES Day is: ".date("N", $heloo). "<br />
           Week is: ". date("W", $heloo);
  } else { 
  echo "NO Day is: ".date("N", $heloo). "<br />Week is: ". date("W", $heloo); 
 }

The weeks seems to work fine but the days doesn't work at all. Could you please point me to the right direction or advice where to get some help?

:-)

Buki
  • 127
  • 1
  • 3
  • 10
  • 1
    Post your inputs and format of expected output. This is easy task :) some examples. – Wh1T3h4Ck5 Apr 06 '11 at 07:41
  • I don't understand... that if statement really translates to `date("W", $heloo) == 12 && date("N", $heloo) == 7` – Jacob Apr 06 '11 at 07:42
  • Also, I can't connect the dots between your code, your description and your question in subject. Be more specific please. – Wh1T3h4Ck5 Apr 06 '11 at 07:56
  • Sorry to confuse... I wanted to create a range of days starting from the last Sunday of march to the last Sunday of October. Is that possible? I have editted the code. Please have a look now. :-) – Buki Apr 06 '11 at 08:00

1 Answers1

1

Try this easy piece of code:

  function rangeSundays($year, $month_start, $month_end) {
    $res = array();
    for ($i = $month_start; $i <= $month_end; $i++) {
      $dt = strtotime('last sunday of this month', strtotime("$year-$i-1"));
      $res[] = date('Y-m-d', $dt);
      } 
    return $res;
    }

So, use it this way

$date_array = rangeSundays(2011, 3, 10); // year, start month, end month
print_r($date_array);

Output

Array
    (
        [0] => 2011-03-27
        [1] => 2011-04-24
        [2] => 2011-05-29
        [3] => 2011-06-26
        [4] => 2011-07-31
        [5] => 2011-08-28
        [6] => 2011-09-25
        [7] => 2011-10-30
    )

Also, if default time zone is not set in your php config (php.ini) add something like this at start of your script to avoid throwing warnings in PHP.

date_default_timezone_set('UTC'); // or any other time zone

To print this result out to screen use

$date_array = rangeSundays(2011, 3, 10);
foreach($date_array as $x) {
  echo "$x<br/>";
  }


If you want to do it without using function
$year = 2011; // or which year you want
$month_start = 3; // for starting month; March in this case
$month_end = 10; // for ending month; October in this case

$res = array();
for ($i = $month_start; $i <= $month_end; $i++) {
  $dt = strtotime('last sunday of this month', strtotime("$year-$i-1"));
  $res[] = date('Y-m-d', $dt);
  }

foreach($res as $sunday) {
  echo "$sunday<br />";
  }

Output

2011-03-27
2011-04-24
2011-05-29
2011-06-26
2011-07-31
2011-08-28
2011-09-25
2011-10-30

Note: DST doesn't affect dates in this case.

Your code looks like unnecessary complication :)

Wh1T3h4Ck5
  • 8,399
  • 9
  • 59
  • 79
  • I'm not really good with functions. is it possible to write the code as generic PHP? I have been struggling, trying to input my data into your function. I have a single data to work on. – Buki Apr 06 '11 at 09:40