【问题标题】:Check if NSDate is in this week or next week检查 NSDate 是在本周还是下周
【发布时间】:2012-04-13 15:30:35
【问题描述】:

有办法检查 NSDate 是本周还是下周?

我知道今天是:

[NSDate date]

那我该怎么办?

【问题讨论】:

  • 你对周的定义是什么?周日开始吗?

标签: iphone ios nsdate


【解决方案1】:

使用 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 可以忽略小时、分钟和秒。我想你想要那个。

【讨论】:

  • 非常感谢,这是最好的答案 :),如果是一年中的最后一周,我必须与其他组件确认,对吗?
  • 没错,记得像这样添加你要使用的组件: NSDateComponents *todaysComponents = [gregorian components:(NSWeekCalendarUnit|NSMonthCalendarUnit) fromDate:date];然后,获取组件并进行比较。
  • 好的,谢谢,因为如果是新年,那么新的周单位数是 1 对吗?
  • 可以,但是最好比较年份,例如:如果 anotherDate 的年份是 currentYear 加 1,我们确定 anotherDate 指的是下一年的日期。
  • 我无法理解年份是否不同,例如如果 currentYear + 1 == anotherYear 所以我必须检查星期,但如果 12 月 31 日是星期四,1 月 1 日是星期三,周数如何工作?
【解决方案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);
}

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

[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:嗯,你确定吗?让我们打赌 +1...查看我的编辑以尝试调用它。
  • 我提交,先生。我试过了,你是对的。假设 firstWeekday 由于某种奇怪的原因尚未设置,而您忘记了,并且正在考虑错误的一周开始...在这种情况下,年份无关紧要...
  • week 已弃用,weekOftHeYear 显然不起作用
  • 这是一个旧答案,现在已弃用,但 weekOfYear 有效,你为什么说它不起作用?
【解决方案3】:

我正在添加我的解决方案(实现为 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]];
}

【讨论】:

    【解决方案4】:
    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
    

    其余的你应该能够做到。 当谈到一年中的最后一周时,它可能会再做一次脑力劳动。

    清除?

    【讨论】:

    • 谢谢,现在我试试,如果是一年中的最后一周会发生什么?
    • 那么你需要做一些数学运算。自己动手,对大脑有好处。 :)
    【解决方案5】:

    注意:这会使用周日-周六周的概念来计算“周”的概念。

    要计算一周中的当前日期,请使用 here 中的以下内容:

    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 获取当前日期和日期。使用日期和日期查找开始和结束日期(如果今天是星期一,则 date - 1 day 是一周的第一天等)。找出日期在哪一周。

    【讨论】:

      【解决方案6】:

      对于 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;
          }
      
      }
      

      【讨论】:

        【解决方案7】:

        忘记日期组件,您必须调整很多东西(检查它是否是一年中的最后一周,检查星期日是否是一周的开始......)并且容易出现错误和意大利面条代码。

        这解决了您的问题,并扩展到检测“上周”、“前几周”、“本周”、“下周”和“后几周”

        -(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;
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-11
          相关资源
          最近更新 更多