我想得到某个月的最后一个工作日。 我已经遇到this simple answer关于如何获得第一/第二/ ......工作日的效果很好的{{3}}。
问题是:如何获得某个月的最后一个工作日? 不是每个月只有4个星期日,所以我必须计算一个月中的星期日数量,还是有更优雅的方式来做这个?
答案 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-Extensions。 dayOfWeek
代表格里高利历中的星期日(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;
}