获得一个月的最后一个工作日

时间:2014-06-06 06:20:11

标签: nsdate nsdatecomponents

我想得到某个月的最后一个工作日。 我已经遇到this simple answer关于如何获得第一/第二/ ......工作日的效果很好的{{3}}。

问题是:如何获得某个月的最后一个工作日? 不是每个月只有4个星期日,所以我必须计算一个月中的星期日数量,还是有更优雅的方式来做这个?

2 个答案:

答案 0 :(得分: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天”)的原因是为了确保我们称之为“下个月”的开始日期不在两个月之间的边缘,我认为这可能会失败。

保留之前显示的代码显然涵盖了所有情况。

答案 1 :(得分: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;
}