2017-02-15 3 views
0

Я хотел бы проверить, является ли NSDate на той же неделе, что и сегодня. Поэтому я считаю, что weekOfYear s от NSDateComponents, как указано в этом 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

Как вы определяете «неделю»? Это текущая «названная неделя» - то есть, начиная с прошлого воскресенья? Начиная с прошлого понедельника? Является ли неделя семь дней подряд? Итак, если 1 января в четверг, то во вторник 6 января все еще первая «неделя»? – DonMag

+0

Возможный дубликат [Как проверить, есть ли NSDate на текущей неделе?] (Http://stackoverflow.com/questions/38970836/how-to-check-if-nsdate-is-in-current-week) –

+0

@DonMag по-моему, неделя с понедельника по воскресенье, как в этом примере: http://week-number.net/calendar-with-week-numbers-2017.html – user3191334

ответ

1

Попробуйте это, может быть? (Скопировано из моего собственного кода проекта)

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 

EDIT: (как указано ниже в разделе комментариев)

понедельник первый день недели по к международному стандарту ISO 8601, но в США, Канаде и Японии он считается вторым днем ​​недели. Понедельник приходит после воскресенья и перед вторником в наш современный григорианский календарь. - timeanddate.com/calendar/days/monday.html Надежда "be_NL" никогда не переходит - DonMag

+0

Спасибо и извините. Я просто скопировал ваш код, и теперь он работает. Я не могу себе представить причину, по которой я всегда получал неделю 8. EDIT: первого решения было достаточно, но второй тоже отлично работает. СПАСИБО :) – user3191334

+0

@ user3191334 NP, вы можете использовать его. Не забудьте принять мой ответ для сообщества :) –

+1

Вы, ребята, уверены, что это делает то, что вы хотите? Если я правильно понимаю, @ user3191334 хочет, чтобы воскресенье, 19 февраля, было на той же неделе, что и сегодня, в среду, 15 февраля. С помощью приведенного выше кода вы устанавливаете дату сравнения в субботу 18, и вы получаете недели 7 и 7. .. Если вы запустите его с помощью '[comps setDay: 19]', вы получите недели 7 и 8. Или? – DonMag

0

Это очень небольшое модификация кода прокрасться в ... Называйте это с:

// 
// 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; 
} 
Смежные вопросы