Ios 这个月有多少个工作日

Ios 这个月有多少个工作日,ios,objective-c,Ios,Objective C,获得一个月的天数很容易 NSDate *today = startDate; NSCalendar *c = [NSCalendar currentCalendar]; NSRange days = [c rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:today]; 但是我如何获得

获得一个月的天数很容易

    NSDate *today = startDate; 
    NSCalendar *c = [NSCalendar currentCalendar];
    NSRange days = [c rangeOfUnit:NSDayCalendarUnit
                           inUnit:NSMonthCalendarUnit
                          forDate:today];

但是我如何获得当月的工作日数(周一至周五)?

你几乎做到了:你已经获得了给定月份的工作日数(
nDays
);现在从1循环到
nDays
,为每一天找到它的星期几,如果是星期一到星期五,则增加一些计数器。Tada,你已经得到了你想要的。

不幸的是,没有直接的方法在两个日期之间循环,也无法直接从NSDate对象获取工作日。因此,您只需要再添加几行就可以了。这里的关键是使用NSDATE组件。对于这个例子,我使用的是公历。根据苹果的文档,默认情况下,工作日从周日开始,也就是第一天(字面上是第一天)。请不要认为星期日是零(很容易混淆)。 它可能需要一些语法更改,因为我没有在XCode上尝试过

NSInteger count = 0;
NSInteger sunday = 1;
NSInteger saturday = 7;

// Set the incremental interval for each interaction.
NSDateComponents *oneDay = [[NSDateComponents alloc] init];
[oneDay setDay:1];

// Using a Gregorian calendar.
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *currentDate = fromDate;

// Iterate from fromDate until toDate
while ([currentDate compare:toDate] == NSOrderedAscending) {

    NSDateComponents *dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:currentDate];

    if (dateComponents.weekday != saturday && dateComponents.weekday != sunday) {
        count++;
    }

    // "Increment" currentDate by one day.
    currentDate = [calendar dateByAddingComponents:oneDay
                                            toDate:currentDate
                                           options:0];
}

NSLog(@"count = %d", count);

让我们看看……如果我们每个月有28天,那么我们总是会有4个周六+周日,即8个休息日。但也有29、30、31天的月份。分析它们的可能性:

1   . 28  | 29  30  31
Mon . Sun | Mon Tue Wed
Tue . Mon | Tue Wed Thu
Wed . Tue | Wed Thu Fri
Thu . Wed | Thu Fri SAT
Fri . Thu | Fri SAT SUN
Sat . Fri | SAT SUN Mon
Sun . Sat | SUN Mon Tue

     29 30 31
4 -> +0 +0 +1
5 -> +0 +1 +1
6 -> +1 +1 +0
7 -> +1 +0 +0

#define inRange(x, a, b) ((x) >= (a) && (x) <= (b))

int nDays = <get days in month>;
int firstWeekday = <get first weekday index>;
int nOffDays = 8;

if (nDays > 28 && inRange(firstWeekday, 6, 7)) nOffDays += 1;
if (nDays > 29 && inRange(firstWeekday, 5, 6)) nOffDays += 1;
if (nDays > 30 && inRange(firstWeekday, 4, 5)) nOffDays += 1;

int nWorkDays = nDays - nOffDays;
1。28  | 29  30  31
周一。星期一至星期二星期三
星期二。周一|周二周三周四
结婚。星期二、三、四、五
清华大学。星期三至五星期六
星期五。星期四星期五星期六星期日
坐。周五|周六-周日-周一
太阳。星期六|星期一至星期二
29 30 31
4 -> +0 +0 +1
5 -> +0 +1 +1
6 -> +1 +1 +0
7 -> +1 +0 +0
#定义范围(x,a,b)((x)>=(a)和&(x)28和&&inRange(第一个工作日,6,7))nOffDays+=1;
如果(星期日>29&&inRange(第一个工作日,5,6))天数+=1;
如果(星期日>30&&inRange(第一个工作日,4,5))天数+=1;
int N工作日=星期日-不工作日;

如果需要,可以使用
NSCalendar
解决此问题,而无需任何循环。你可以通过分解问题来实现这一点

基本理念

const NSUInteger Sunday = 1, ....., Saturday = 7;

NSUInteger workdaysCount 
        = getNumberOfDaysInMonth(today)
        - getWeekdayCountInMonth(today, Saturday)
        - getWeekdayCountInMonth(today, Sunday);
现在,我们要实现两个功能:

获取一个月的天数

你已经做对了

NSUInteger getNumberOfDaysInMonth(NSDate* date) {
    NSCalendar *c = [NSCalendar currentCalendar];
    return [c rangeOfUnit:NSCalendarUnitDay
                   inUnit:NSMonthCalendarUnit
                  forDate:date].length;
}
获取一个月内给定工作日的计数

这是一个更棘手的问题,但是
NSCalendar
提供了基本的构建块:

NSUInteger getWeekdayCountInMonth(NSDate* date, enum Weekdays weekday) {
    NSCalendar *c = [NSCalendar currentCalendar];
    NSDate* startOfMonth = getMonthStart(date);
    NSDate* firstMatchingWeekday = [c dateBySettingUnit:NSWeekdayCalendarUnit value:weekday ofDate:startOfMonth options:0];

    // Number of days from start of month until we are at given weekday
    NSUInteger daysToWeekday = [c components:NSDayCalendarUnit
                                    fromDate:startOfMonth
                                      toDate:firstMatchingWeekday options:0].day;

    NSUInteger days = getNumberOfDaysInMonth(date) - daysToWeekday;

    return (days + 6) / 7;
}

你想考虑假期,还是只计算星期五的天数?我不介意它是否是假日。使用NSCalendar是不可能的。我曾认为可能有一个优雅的解决方案,包括计算给定月份2到6之间的NSWeekdayCalendarUnits的数量。这可能很有用:。我喜欢你在这里做的事情,而且看起来很棒。@LpLrich我弄乱了日期索引,我的代码假设1是星期一,但事实并非如此。很快修复,请随意使用:)非常感谢,这是一个很好的答案。嗯,这可能是目前为止最好的解决方案。我不知道哪一个答案是正确的!我把它留给第一个给我正确答案的人。