检查NSDate是否在本周或下一周。

3
有一种方法可以检查NSDate是否为本周或下周吗?
我知道今天是:
[NSDate date]

然后我该怎么做?

2
你对“星期”有什么定义?它是从星期日开始还是不包括星期日? - N_A
7个回答

6
使用NSDateComponents,类似下面这样的方式:
NSCalendar *gregorian = [[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *today = [NSDate date];

    NSDateComponents *todaysComponents =
        [gregorian components:NSWeekCalendarUnit fromDate:date];

    NSUInteger todaysWeek = [todaysComponents week];


    NSDate *anotherDate = [NSDate date];

    NSDateComponents *otherComponents =
        [gregorian components:NSWeekCalendarUnit fromDate:anotherDate];

    NSUInteger anotherWeek = [otherComponents week];

    if(todaysWeek==anotherWeek){
         NSLog(@"another date is this week");
    }else if(todaysWeek+1==anotherWeek){
         NSLog(@"another date is next week")
    }

你还可以使用其他组件,比如月份或年份,以确保完全正确。
注意:不要使用timeIntervals。通过使用NSDateComponents,您可以忽略小时、分钟和秒。我认为你想要这样。

非常感谢,这是最好的答案 :) 如果是年底的最后一周,我需要与其他组件进行核实,以确保正确吗? - Piero
确切地说,记得像这样添加你要使用的组件:NSDateComponents *todaysComponents = [gregorian components:(NSWeekCalendarUnit|NSMonthCalendarUnit) fromDate:date]; 然后,获取这些组件并进行比较。 - Eduardo
好的,谢谢。因为如果是新的一年,新的周单位数就是1对吗? - Piero
1
我无法理解如果年份不同,例如如果当前年份+1 == 另一年份,那么我必须检查周数,但如果12月31日是星期四,而1月1日是星期三,那么周数如何计算? - Piero
我认为我不理解 :S 给我两个日期的示例,这样我就可以弄清楚了。 - Eduardo
显示剩余2条评论

2

将这两个日期传递给该方法:

- (BOOL) isSameWeekAsDate: (NSDate *) aDate andDate:(NSDate *) bDate
{
    NSDateComponents *components1 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:aDate];
    NSDateComponents *components2 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:bDate];

    if ([components1 week] != [components2 week]) return NO;

    //return (abs([self timeIntervalSinceDate:aDate]) < 604800); // ops, forgot to change "self" with parameter "bDate":
    return (abs([bDate timeIntervalSinceDate:aDate]) < 604800);
}

编辑: 使用两个不同年份的日期调用它:

[components setDay:31];
[components setMonth:12];
[components setYear:2010];
NSCalendar *gregorian = [[NSCalendar alloc]  initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date1 = [gregorian dateFromComponents:components];

// second date (SATURDAY -of the same week, other year...)
[components setDay:1];
[components setMonth:1];
[components setYear:2011];
NSDate *date2 = [gregorian dateFromComponents:components];

if ([self isSameWeekAsDate:date1 andDate:date2]) {
    NSLog(@"Same Week!");
}else{
    NSLog(@"OTHER WEEK!");
}

如果两个日期在同一周但不同年份,则这将返回NO,我想... - samson
@samson:嗯,你确定吗?让我们打个+1的赌...看看我对它的调用进行了编辑。 - meronix
我提交,先生。我尝试了一下,您是正确的。假设由于某种奇怪的原因未设置firstWeekday,并且您忘记了并且考虑了错误的周开始...在这种情况下,年份无关紧要... - samson
1
周已被弃用,yearOfTheWeek显然无法工作。 - Peter Lapisu
这是一个旧的答案,现在它已经过时了,但 weekOfYear 可以使用,为什么你说不行? - meronix

1

我正在添加我的解决方案(实现为一个NSDate类别),它不使用在iOS7、iOS8中已被弃用的星期。

- (NSDate *)firstDateOfWeek {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *startOfWeek;
    [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&startOfWeek interval:NULL forDate:self];
    return startOfWeek;
}

- (BOOL)isSameWeekWithDate:(NSDate *)date {
    if (ABS(self.timeIntervalSince1970 - date.timeIntervalSince1970) > (7 * 24 * 60 * 60)) {
        return NO;
    }    
    return ([[self firstDateOfWeek] timeIntervalSince1970] == [[date firstDateOfWeek] timeIntervalSince1970]);
}

- (BOOL)isThisWeek {
    return [self isSameWeekWithDate:[NSDate new]];
}

0

对于 iOS 7 及以上版本,您需要将 NSWeekCalendarUnit 替换为 NSCalendarUnitWeekOfYear

- (NSInteger)thisW:(NSDate *)date
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
    NSUInteger todaysWeek = [todaysComponents weekOfYear];
    NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:date];
    NSUInteger datesWeek = [otherComponents weekOfYear];

    //NSLog(@"Date %@",date);
    if(todaysWeek==datesWeek){
        //NSLog(@"Date is in this week");
        return 1;
    }else if(todaysWeek+1==datesWeek){
        //NSLog(@"Date is in next week");
        return 2;
    } else {
        return 0;
    }

}

0

不要再考虑日期组件了,你需要调整很多东西(检查是否是年的最后一周,检查星期天是否是一周的开始……),容易出现错误和混乱的代码。

这个解决方案能够检测“上周”、“前几周”、“本周”、“下周”和“以后几周”,并且能帮助你解决问题。

-(EventWeekRange)numberOfWeeksFromTodayToEvent:(NSDate *)eventDate {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSComparisonResult comparison = [calendar compareDate:[NSDate date] toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear];
    if (comparison == NSOrderedSame) {
        return RangeThisWeek;
    } else if (comparison == NSOrderedAscending) { // The event date is in the future
        // Advance today's date one week to check if this new date is in the same week as the event
        NSDate *todaysNextWeek = [[NSDate date]dateByAddingTimeInterval:60*60*24*7];
        if ([calendar compareDate:todaysNextWeek toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) {
            return RangeNextWeek;
        } else {
            return RangeLater;
        }
    } else { // The event date is in the past
        // Advance the event's date one week to check if this new date is in the same week as today
        NSDate *eventsNextWeek = [eventDate dateByAddingTimeInterval:60*60*24*7];
        if ([calendar compareDate:eventsNextWeek toDate:[NSDate date] toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) {
            return RangeLastWeek;
        } else {
            return RangeEarlier;
        }
    }
}

0
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:yourDate];
NSInteger week = [components week]; // here your have a Integer with the weeknr of yourDate

components = [cal components:NSWeekCalendarUnit fromDate:[NSDate date]];
weekToday = [components week]; // here your have a Integer with the weeknr of today

其他部分应该你能够完成。在一年的最后一周可能需要更多的思考。

清楚吗?


谢谢,现在我尝试一下。如果是一年中的最后一周会发生什么? - Piero
然后你需要做一些数学方面的事情。自己做,这对大脑有好处。 :) - Jonas Schnelli

0

注意:此处使用以周日至周六为一周的概念来计算“周”的概念。

要计算本周的当前日期,请使用此处提供的以下内容:

NSCalendar *gregorian = [[NSCalendar alloc]  initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest];

NSInteger weekday = [weekdayComponents weekday];
// weekday 1 = Sunday for Gregorian calendar

[gregorian release];

其它的部分应该很容易。获取当前日期和你的NSDate日期。使用天数和日期找到开始和结束日期(如果今天是星期一,则日期-1天是本周的第一天等)。确定日期所在的那一周。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接