how to find the last monday of the month

前端 未结 3 542
死守一世寂寞
死守一世寂寞 2021-01-05 18:55

I\'m not sure how to go about this one. I\'m building a calendar in PHP and need users to be able to add a repeating event that follows the following rule:

Last [DOW

相关标签:
3条回答
  • 2021-01-05 19:33

    Here's an alternative:

    <?
    function lastDayOfMonth($month, $year) {
        switch ($month) {
            case 2:
                # if year is divisible by 4 and not divisible by 100
                if (($year % 4 == 0) && ($year % 100) > 0)
                    return 29;
                # or if year is divisible by 400
                if ($year % 400 == 0)
                    return 29;
                return 28;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30; 
            default:
                return 31;
        }
    }
    
    function lastDayOfWeek($month, $year, $dow) {
        $d = new DateTime();
    
        #Finding the last day of month
        $d = $d->setDate($year, $month, lastDayOfMonth($month, $year));
    
        #Getting the day of week of last day of month
        $date_parts = getdate($d->getTimestamp());
    
        $diff = 0;
    
        #if we can't find the $dow in this week... (cause it would lie on next month)
        if ($dow > $date_parts['wday']) {
            # ...we go back a week.
            $diff -= 7;
        }
    
        return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']);  
    }
    
    # checking the algorithm for this month...
    for ($i=0; $i < 7; $i++) {
        echo lastDayOfWeek(6,2011,$i) . "<br>";
    }
    
    ?>
    
    0 讨论(0)
  • 2021-01-05 19:39

    For everything date-related that you can express in proper English but have a hard time expressing using numbers, strtotime is your best friend.

    echo strtotime("last Monday of June 2011");
    

    This returns a timestamp that you can use as the second parameter to date and the likes to get a proper, human-readable date. Since it's a built-in function written in C, this solution is also much faster than almost anything else you could come up with written in PHP (though I'm quite sure it wouldn't matter much in a real-world scenario).

    So assuming you have $month=4, $dow=3 and $year=2011, you'll need an array mapping $month values to their English textual representations and another array mapping $dow values to their textual representations.

    0 讨论(0)
  • 2021-01-05 19:45

    I have a generic function for you to calculate the nth day of a month. Hope this could help you to resolve your issue.

    function get_Nth_dow($dow, $occurence, $m, $y)
    {
        $numdays = date('t', mktime(0, 0, 0, $m, 1, $y));
        $add = 7 * ($occurence - 1);
        $firstdow = date('w', mktime(0, 0, 0, $m, 1, $y));
        $diff = $firstdow - $dow;
    
        $day_of_month = 1;
        if ($diff > 0)
        {
            $day_of_month += ($add - $diff);
        }
        elseif ($diff < $numdays)
        {
            $day_of_month -= ($diff - $add);
        }
    
        return $day_of_month;
    }
    

    $DOW = day of the week (0 = Sunday, 6 = Saturday).

    $X = occurence (1 = first, 2 = third, etc..). If the given month does

    not have the occurrence, then it will return the last. For example, if

    you ask for the 7th occurrence of Friday, it will return the last

    Friday of the month. $M = month $Y = year

    Example, get_Nth_DOW(2,3,7,2009) will return the third Tuesday of 7th 2009.

    0 讨论(0)
提交回复
热议问题