2014-06-06 113 views
0

我想獲取給定月份的最後一個工作日。 我遇到this simple answer關於如何獲得1st/2nd/... weekday的效果。獲取一個月的最後一個工作日

問題是:如何獲得給定月份的最後一個工作日? 不是每個月都只有4個星期天,所以我是否要計算一個月的星期日數量,還是有更好的方法來做到這一點?

回答

0

我終於想出了以下解決方案。爲了方便,我使用了NSDate-ExtensionsdayOfWeek代表格里曆中的星期日(1)至星期六(7):

- (NSDate *)dateOfLastDayOfWeek:(NSInteger)dayOfWeek afterDate:(NSDate *)date 
{ 
    // Determine the date one month after the given date 
    date = [date dateByAddingMonths:1]; 

    // Set the first day of this month 
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
    dateComponents.year = date.year; 
    dateComponents.month = date.month; 
    dateComponents.day = 1; 

    // Get the date and then the weekday of this first day of the month 
    NSDate *tempDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *firstDayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:tempDate]; 
    NSInteger weekday = firstDayComponents.weekday; 

    // Determine how many days we have to go back to the desired weekday 
    NSInteger daysBeforeThe1stOfNextMonth = (weekday + 7) - dayOfWeek; 
    if (daysBeforeThe1stOfNextMonth > 7) 
    { 
     daysBeforeThe1stOfNextMonth -= 7; 
    } 

    NSDate *dateOfLastDayOfWeek = [tempDate dateBySubtractingDays:daysBeforeThe1stOfNextMonth]; 
    return dateOfLastDayOfWeek; 
} 
0

有同樣的需求最近,我能想出的最好的是下面的,這是指每天要運行檢查,如果當前日期是當月的最後一個工作日:

<?php 
$d = new DateObject('first day of this month', date_default_timezone()); 
$d->modify("+15 days"); 
$d->modify("first day of next month -1 weekday"); 
$last = date_format($d, 'd'); 
$today = new DateObject('today', date_default_timezone()); 
$today = date_format($today, 'd'); 
if ($today == $last) { 
    //bingo 
} 
?> 

我一直在測試,到目前爲止找不到一個失敗的例子。在中間進行修改(「+ 15天」)的原因是爲了確保我們在下個月調用的開始日期不在兩個月之間,我相信這可能會失敗。

離開之前顯示的代碼顯然涵蓋了所有情況。

相關問題