如何检查NSDate是否在当前周?

5

如何检查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;
    }

}

“weekday” 属性提供了一周中的日期。星期日,星期一等。 - Avi
参考此 Stack Overflow 帖子获取iOS SDK中的周数。 - Dipen Panchasara
6个回答

6

这个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
    }
}

这对于在同一周历法中但是在另一年的日期无效。 - Falco Winkler

2
使用NSCalendarrangeOfUnit: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
}

1
我必须将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;
    }

}

1

我修改了Vadian的回答来适用于Swift 5.3.x。其他回答对我没有效果。例如,使用去年(2020年)的日期来测试该方法,它们会返回true。

这是一个Swift扩展NSDate,因为我必须在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

0
使用此函数获取周数:
- (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");
}

0

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

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

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