【问题标题】:How to check if NSDate is in current week?如何检查 NSDate 是否在本周?
【发布时间】:2016-12-22 14:07:51
【问题描述】:

如何检查NSDate 是否在一年中的当前周?我在下面尝试过,但上周的日期也在"Date is in this week" 条件内。

- (NSInteger)thisW:(NSDate *)date
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];

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

    NSUInteger todaysWeek = [todaysComponents weekday];


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

    NSUInteger datesWeek = [otherComponents weekday];
    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;
    }

}

【问题讨论】:

标签: ios objective-c nsdate


【解决方案1】:

Swift 4 中的这个简短扩展怎么样?

extension Calendar {
    func isDayInCurrentWeek(date: Date) -> Bool? {
        let currentComponents = Calendar.current.dateComponents([.weekOfYear], from: Date())
        let dateComponents = Calendar.current.dateComponents([.weekOfYear], from: date)
        guard let currentWeekOfYear = currentComponents.weekOfYear, let dateWeekOfYear = dateComponents.weekOfYear else { return nil }
        return currentWeekOfYear == dateWeekOfYear
    }
}

【讨论】:

    【解决方案2】:

    使用NSCalendar的方法rangeOfUnit:startDate:interval:forDate计算当前周的开始日期和间隔的解决方案

    - (BOOL)isInCurrentWeek:(NSDate *)date
    {
      NSDate *startDate = nil;
      NSTimeInterval interval = 0.0;
      NSCalendar *calendar = [NSCalendar currentCalendar];
      // calendar.firstWeekday = 1; set the index of the first weekday if necessary
      [calendar rangeOfUnit:NSWeekOfYearCalendarUnit startDate: &startDate interval: &interval forDate: [NSDate date]];
      NSDate *endDate = [calendar dateByAddingUnit:NSSecondCalendarUnit value: (NSInteger)interval toDate: startDate options:NSCalendarMatchNextTime];
      return [date compare:startDate] == NSOrderedDescending && [date compare:endDate] == NSOrderedAscending;
    }
    

    或在 Swift 中

    func isDateInCurrentWeek(_ date : Date) -> Bool
    {
        var startDate = Date()
        var interval : TimeInterval = 0.0
        let calendar = Calendar.current
        // calendar.firstWeekday = 1 set the index of the first weekday if necessary
        calendar.dateInterval(of: .weekOfYear, start: &startDate, interval: &interval, for: Date())
        let endDate = calendar.date(byAdding:.second, value: Int(interval), to: startDate)!
        return date >= startDate && date < endDate
    }
    

    【讨论】:

      【解决方案3】:

      我不得不将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;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        使用此函数获取周数:

        - (NSInteger)numberOfWeek:(NSDate *)date
        {
            NSCalendar *calender = [NSCalendar currentCalendar];
            NSDateComponents *components = [calender components:NSCalendarUnitWeekOfYear fromDate:date];
            return [components weekOfYear];
        }
        

        使用此代码,您可以像这样比较星期。我只是使用下周日期使用dateWithTimeIntervalSinceNow: 仅用于比较。

        if ([self numberOfWeek:[NSDate date]] == [self numberOfWeek:[NSDate dateWithTimeIntervalSinceNow: (60.0f*60.0f*24.0f*7.0f)]])
        {
            NSLog(@"Same Week");
        }
        else
        {
            NSLog(@"Different Week");
        }
        

        【讨论】:

          【解决方案5】:

          首先获取当前日期当周的第一天和最后一天。

          NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
          
          NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]];
          
          
          [currentComps setWeekday:1]; // 1: sunday
          NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
          [currentComps setWeekday:7]; // 7: saturday
          NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
          

          现在使用下面给出的方法输入您感兴趣的日期

          BOOL isInCurrentWeek = [self date:your given date isBetweenDate:firstDayOfTheWeek andDate:lastDayOfTheWeek];
          NSLog(@"%d",isInCurrentWeek);
          

          期望的方法

          - (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
          {
              if ([date compare:beginDate] == NSOrderedAscending)
                  return NO;
          
              if ([date compare:endDate] == NSOrderedDescending)
                  return NO;
          
              return YES;
          }
          

          【讨论】:

            【解决方案6】:

            Swift 5.3.x,修改了 Vadian 的答案。其他答案对我不起作用。例如,用去年(2020)的日期测试方法,它们返回true。

            这是NSDate 的 Swift 扩展,因为我必须在 Objective-C 类中使用这个函数。

            import Foundation
            
            extension NSDate {
              @objc func isInCurrentWeek() -> Bool {
                var startDate = Date()
                var interval : TimeInterval = 0.0
                let calendar = Calendar.current
                // calendar.firstWeekday = 1 set the index of the first weekday if necessary
                calendar.dateInterval(of: .weekOfYear, start: &startDate, interval: &interval, for: Date())
                let endDate = calendar.date(byAdding:.second, value: Int(interval), to: startDate)!
                return (self as Date) >= startDate && (self as Date) < endDate
            
              }
            }
            

            以及示例测试/用例:

            let df = DateFormatter()
            df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
            let d = "2021-01-23T13:56:49+0000"
            let d2 = df.date(from: d)
            
            print((d2! as NSDate).isInCurrentWeek()) // prints true, current date is Jan 21, 2021
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-11-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-07
              相关资源
              最近更新 更多