Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 计算';上周五';w/NSDate和x2B;NSDATE组件_Cocoa_Cocoa Touch_Nsdate_Nsdatecomponents - Fatal编程技术网

Cocoa 计算';上周五';w/NSDate和x2B;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

使用NSDate和NSDate组件计算相对于当前日期的特定天数时遇到一些问题。比如说,我想上周五去。我尝试了以下方法:

    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]//一周前