Search code examples
phpdatetimedatedstgmt

Get last Sunday within a range of two dates (GMT, DST)


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?

:-)


Solution

  • 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 :)