Cocoa 计算';上周五';w/NSDate和x2B;NSDATE组件
使用NSDate和NSDate组件计算相对于当前日期的特定天数时遇到一些问题。比如说,我想上周五去。我尝试了以下方法:Cocoa 计算';上周五';w/NSDate和x2B;NSDATE组件,cocoa,cocoa-touch,nsdate,nsdatecomponents,Cocoa,Cocoa Touch,Nsdate,Nsdatecomponents,使用NSDate和NSDate组件计算相对于当前日期的特定天数时遇到一些问题。比如说,我想上周五去。我尝试了以下方法: NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinute
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:[NSDate date]];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
[components setWeekday:6]; //Friday
[components setWeek:[components week] - 1]; //Last Week
return [[NSCalendar currentCalendar] dateFromComponents:components];
但这只是返回当前日期,好像它无法理解我的要求
这感觉应该足够简单,但我只是没有让它工作。有什么建议吗?像这样的建议怎么样:
NSDate* today = [NSDate date];
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:today];
// do the modulo arithmetic to determine the delta days to last Friday
NSInteger weekday = [comps weekday];
NSInteger deltaDays = 0; // left as exercise, I am hungry for lunch...
NSDateComponents* delta = [[NSDateComponents alloc] init];
[delta setDay:deltaDays];
NSDate* lastFriday = [[NSCalendar currentCalendar] dateByAddingComponents:delta toDate:today options:0];
[delta release];
使用此代码:
- (NSDate *)lastDayOfMonthWithDate:(NSDate *)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:date];
components.month += 1;
components.day = 0;
NSDate *lastDayOfMonth = [[NSCalendar currentCalendar] dateFromComponents:components];
return lastDayOfMonth;
}
- (NSDate *)lastFridayOfMonthWithDate:(NSDate *)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit fromDate:[self lastDayOfMonthWithDate:date]];
if (components.weekday >= 6) {
components.day -= components.weekday - 6;
} else {
components.day += 6 - components.weekday - 7;
}
NSDate *lastFridayOfMonth = [[NSCalendar currentCalendar] dateFromComponents:components];
return lastFridayOfMonth;
}
我写了这个函数:
- (NSInteger)lastOccurrenceOfWeekdayWithNumber:(NSInteger)weekdayNumber inMonthForDate:(NSDate *)date {
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal;
NSRange range = [_calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
NSDateComponents *dateComponents = [_calendar components:units fromDate:date];
dateComponents.day = range.length;
date = [_calendar dateFromComponents:dateComponents];
dateComponents = [_calendar components:units fromDate:date];
while (dateComponents.weekday != weekdayNumber) {
dateComponents.day -= 1;
date = [_calendar dateFromComponents:dateComponents];
dateComponents = [_calendar components:units fromDate:date];
}
return dateComponents.weekdayOrdinal;
}
weekdayNumber
在查找周日时为1。2星期一
如果您想查找10月份的最后一个星期五,可以使用以下选项:
[self lastOccurrenceOfWeekdayWithNumber:6 inMonthForDate:date];
其中date是指2016年10月11日或10月的其他任何一天。我最后做了一些类似的事情:NSDate*today=[NSDate-date];NSCalendar*日历=当前日历;NSDateComponents*weekdayComponents=[日历组件:NSWeekdayCalendarUnitFromDate:today];NSDateComponents*componentsToSubtract=[[NSDateComponents alloc]init];[componentsToSubtract设置日:0-([weekdayComponents weekday]-6)];NSDate*fridayDate=[日历日期通过添加组件:组件减去日期:今天选项:0];返回[fridayDate addTimeInterval:weekAgoInSeconds]//一周前