假设我们使用的是公历日历系统之间的号码周末,什么是制定出有两个NSDate
对象之间发生这周末的数目最好的方法是什么?2个NSDates
我目前的做法是计算两个NSDate
之间的天数,然后除以7和floor()
结果。这给了我几周的时间,结果是周末的数量。因为如果一周尚未完成(并且该部门有剩余部分),我们就会得到结果,它会忽略该结果并只考虑已经过去的整周。
改善和稳健性的任何建议,将不胜感激。
假设我们使用的是公历日历系统之间的号码周末,什么是制定出有两个NSDate
对象之间发生这周末的数目最好的方法是什么?2个NSDates
我目前的做法是计算两个NSDate
之间的天数,然后除以7和floor()
结果。这给了我几周的时间,结果是周末的数量。因为如果一周尚未完成(并且该部门有剩余部分),我们就会得到结果,它会忽略该结果并只考虑已经过去的整周。
改善和稳健性的任何建议,将不胜感激。
当你注意你的解决方案可能会返回一个值小于周末的实际数量。
若要计算可能的额外周末,如果除以7后的总天数的剩余天数大于0,则比较周日数(例如NSDateComponents
的weekday
-这是周日的7到周六的1)开始和结束日期。如果结束的周日数小于开始日期,那么必须有一个周末之间(周六/周日的变化计算为周末 - 如果您觉得合适的话进行调整)。
HTH
这里有一个快速的实现:
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:1209600];
NSDate *startDate = [NSDate date];
NSDateComponents *comps = [cal components:NSCalendarUnitWeekday | NSCalendarUnitDay fromDate:startDate toDate:endDate options:kNilOptions];
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US"]];
[fmt setDateFormat:@"EEEE"];
NSArray *weekend = [fmt weekdaySymbols];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF == 'Saturday' || SELF == 'Sunday'"];
NSArray *weekendArr = [weekend filteredArrayUsingPredicate:pred];
NSString *weekendsStr = [weekendArr componentsJoinedByString:@""];
NSDateComponents *compsWithDay = [[NSDateComponents alloc] init];
[compsWithDay setDay:1];
NSString *dayNameStr = [fmt stringFromDate:startDate];
NSUInteger count = 0;
if ([weekendsStr rangeOfString:dayNameStr].location != NSNotFound) {
count++;
}
for (int i = 0; i < comps.day; i++) {
startDate = [cal dateByAddingComponents:compsWithDay toDate:startDate options:kNilOptions];
dayNameStr = [fmt stringFromDate:startDate];
if ([weekendsStr rangeOfString:dayNameStr].location != NSNotFound) {
count++;
}
}
注:
尝试这样,代码的描述是否有意见: -
//Assuming this is your dates where you need to determine the weekend in between two dates
NSString *[email protected]"10-01-2014";
NSString *[email protected]"19-01-2014";
NSDateFormatter *format=[[NSDateFormatter alloc]init];
[format setDateFormat:@"dd-MM-yyyy"];
NSDate *dt1=[format dateFromString:strDate1];
NSDate *dt2=[format dateFromString:strDate2];
//Now finding the days between two dates
NSUInteger units = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit;
NSCalendar *cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *com=[cal components:units fromDate:dt1 toDate:dt2 options:0];
NSInteger day1=[com day];
int i=0;
int j=0;
//Now calculating how many weekends(Sat, Sun) are there in the total number of days.
for(i=0; i<=day1; i++)
{
com=[[NSDateComponents alloc]init];
[com setDay:i];
NSDate *newDate = [[NSCalendar currentCalendar]
dateByAddingComponents:com
toDate:dt1 options:0];
[format setDateFormat:@"EEE"];
NSString *satSun=[format stringFromDate:newDate];
if ([satSun isEqualToString:@"Sat"] || [satSun isEqualToString:@"Sun"])
{
j++;
}
}
NSLog(@"Total number of weekends found= %d",j);