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是星期一,但事实并非如此。很快修复,请随意使用:)非常感谢,这是一个很好的答案。嗯,这可能是目前为止最好的解决方案。我不知道哪一个答案是正确的!我把它留给第一个给我正确答案的人。