使用一年中的一周检查 NSDate 是否在当前周

Check whether a NSDate is in current week using week of year

我想检查 NSDate 是否与今天在同一周。因此,我考虑 NSDateComponents 中的 weekOfYears,就像 post.

中提到的那样
- (BOOL)dateIsThisWeek:(NSDate *)date
{
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setFirstWeekday: 2];    // Added in second try

    NSDate *today = [NSDate date];
    NSDateComponents *todaysComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: today];
    NSUInteger todaysWeek = [todaysComponents weekOfYear];

    NSDateComponents *otherComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: date];
    NSUInteger anotherWeek = [otherComponents weekOfYear];

    return todaysWeek == anotherWeek;    // todaysWeek=7 | anotherWeek=8
}

在我的示例中,我有以下日期:

today:  2017-02-15 12:00:00 +0000
date:   2017-02-18 12:00:00 +0000

问题是,todaysWeek 设置为 7,anotherWeek 设置为 8,我无法想象为什么。

我想问题可能出在星期天,所以我将日历的第一个工作日设置为 2(星期一),但不幸的是没有成功。

更新

我也试过这段代码,但不幸的是结果相同:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate: date];
NSUInteger datesWeek = [otherComponents weekOfYear];

return todaysWeek==datesWeek;    // todaysWeek=7 | datesWeek=8

两个日期都应该在第 7 周,就像多个 websites 描述的那样。

也许试试这个? (复制自自己的项目代码)

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
[gregorianCalendar setLocale:[NSLocale localeWithLocaleIdentifier:@"be_NL"]];

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:19];
[comps setMonth:02];
[comps setYear:2017];
NSDate *date = [gregorianCalendar dateFromComponents:comps];

//NSCalendar *cal = [NSCalendar currentCalendar];
//[gregorianCalendar setFirstWeekday:2];    // Added in second try

NSDate *today = [NSDate date];
NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: today];
//[todaysComponents setWeekdayOrdinal:2];

NSDateComponents *otherComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: date];
//[otherComponents setWeekdayOrdinal:2];

// Not sure if needed to set timezone too depending on your local time, but you can set this for all dates if needed
//[otherComponents setTimeZone:[NSTimeZone localTimeZone]];

NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSUInteger anotherWeek = [otherComponents weekOfYear];

NSLog(@"todays week %ld",(long)todaysWeek);
NSLog(@"anotherWeek %ld",(long)anotherWeek);

打印出来:

2017-02-17 03:51:58.231797 Sneak[5518:2676264] todays week 7
2017-02-17 03:51:58.231836 Sneak[5518:2676264] anotherWeek 7

编辑:(如下评论部分所述)

根据国际标准 ISO 8601,星期一是一周的第一天,但​​在美国、加拿大和日本,它被视为一周的第二天。在我们现代的公历中,星期一在星期日之后和星期二之前。 - timeanddate.com/calendar/days/monday.html 希望 "be_NL" 永远不会切换 – DonMag

这是对 Sneak 代码的非常轻微的修改...调用它:

//
// startDayOfWeek: Sunday == 1, Monday == 2, Tues == 3, etc

Bool b = [self dateIsThisWeek:date startDayOfWeek:2];


- (BOOL)dateIsThisWeek:(NSDate *)dateToTest startDayOfWeek:(NSInteger)iStart {

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    // this is the key - 1 == week runs Sunday-Saturday, 2 == Monday-Sunday, 3 == Tues-Mon, etc
    [gregorianCalendar setFirstWeekday:iStart];

    NSDate *today = [NSDate date];

    NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: today];
    NSInteger todaysWeek = [todaysComponents weekOfYear];

    NSDateComponents *testComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: dateToTest];
    NSInteger testsWeek = [testComponents weekOfYear];

    return todaysWeek == testsWeek;
}