检查一个NSDate是否在本周使用当周

问题描述:

我想检查一个NSDate是否与今天在同一周。所以我认为weekOfYearNSDateComponents s就像这post中提到的。检查一个NSDate是否在本周使用当周

- (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(星期一),可惜没有成功。

UPDATE

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

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的描述。

+1

你如何定义一个“周”?它是当前的“命名周” - 即从上个星期天开始?从上周一开始?连续7天是一周吗?那么,如果1月1日是星期四,那么1月6日星期二仍然是第一个“星期”? – DonMag

+0

的可能的复制[如何检查是否NSDate的是在本周?](http://*.com/questions/38970836/how-to-check-if-nsdate-is-in-current-week) – 2017-02-15 13:46:34

+0

@DonMag在我看来,一周是周一到周日,就像这个例子:http://week-number.net/calendar-with-week-numbers-2017.html – user3191334

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

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

+0

谢谢抱歉。我刚刚复制了你的代码,现在它正在工作。我无法想象为什么我总是得到第8周的原因。编辑:第一个解决方案已经足够,但第二个解决方案也很好。谢谢:) – user3191334

+0

@ user3191334 NP,你可以使用它。不要忘记接受我的社区答案:) – 2017-02-15 14:19:26

+1

你们*确定*这是做你想做的?如果我理解正确,@ user3191334希望2月19日星期日与今天,星期三,2月15日在同一周。使用上面的代码,您将比较日期设置为星期六,18,并获得7和7周。 ..如果你用'[comps setDay:19]'运行它,你会得到第7和第8周。或者? – DonMag

这是一个非常轻微修改潜行的代码......与调用它:

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