Проверьте, находится ли NSDate на текущей неделе, используя неделю года

Я хотел бы проверить, находится ли NSDate на той же неделе, что и сегодня. Поэтому я рассматриваю weekOfYears из NSDateComponents, как указано в этом опубликовать.

- (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

Обе даты должны приходиться на седьмую неделю, как описывают несколько веб-сайтов.


person user3191334    schedule 15.02.2017    source источник
comment
Как определить неделю? Это текущая названная неделя, то есть начиная с прошлого воскресенья? Начиная с прошлого понедельника? Неделя состоит из 7 дней подряд? Итак, если 1 января приходится на четверг, то вторник, 6 января, по-прежнему является первой неделей?   -  person DonMag    schedule 15.02.2017
comment
@Sneak, к сожалению, твое предложение не решило мою проблему. Используя код, помеченный как решенный в посте, возвращает те же номера недель, 7 и 8.   -  person user3191334    schedule 15.02.2017
comment
@user3191334 user3191334 Я не уверен, в чем проблема, текущая неделя сегодня 7, следующая неделя 8, вы можете видеть, что epochconverter.com/weeknumbers вам также следует проверить эту проблему, возможно, это поможет вам на правильном пути, но я не понимаю, в чем проблема именно при чтении вашего вопроса: stackoverflow.com/questions/16875420/   -  person    schedule 15.02.2017
comment
@Sneak Итак, мое второе свидание, 18.02., которое на 7 неделе, также подтверждено вашей ссылкой. Week 07 is from Monday February 13, 2017 until (and including) Sunday February 19, 2017. не должен иметь weekOfYear 8, как код возврата.   -  person user3191334    schedule 15.02.2017
comment
@user3191334 user3191334 Проверьте мой ответ   -  person    schedule 15.02.2017


Ответы (2)


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

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

person Community    schedule 15.02.2017
comment
Спасибо и извините. Я просто скопировал ваш код, и теперь он работает. Я не могу представить причину, по которой у меня всегда была 8-я неделя. РЕДАКТИРОВАТЬ: первого решения было достаточно, но второе тоже отлично работает. БЛАГОДАРНОСТЬ :) - person user3191334; 15.02.2017
comment
@user3191334 user3191334 NP, можешь использовать. Не забудьте принять мой ответ для сообщества :) - person ; 15.02.2017
comment
Ребята, вы уверены, что это именно то, что вам нужно? Если я правильно понимаю, @user3191334 хочет, чтобы воскресенье, 19 февраля, было на той же неделе, что и сегодня, среда, 15 февраля. С помощью приведенного выше кода вы устанавливаете дату сравнения на субботу, 18, и получаете недели 7 и 7. .. Если вы запустите его с [comps setDay:19], вы получите недели 7 и 8. Или? - person DonMag; 15.02.2017
comment
Спасибо @DonMag за подсказку. Да, я не заметил, что воскресенье, 19 февраля, находится на 8-й неделе в соответствии с текущим кодом. У вас есть идея, как изменить код, чтобы 19-е тоже было на 7-й неделе? - person user3191334; 16.02.2017
comment
@user3191334 user3191334 Думаешь, я тебя разочарую? Проверьте мой обновленный ответ :) - person ; 17.02.2017
comment
@Sneak Ahhh установка локали делает свое дело! Большое спасибо! - person user3191334; 17.02.2017
comment
Понедельник — это первый день недели в соответствии с международным стандартом ISO 8601, но в США, Канаде и Японии он считается вторым днем ​​недели. Понедельник наступает после воскресенья и перед вторником в нашем современном григорианском календаре. - timeanddate.com/calendar/days/monday.html Надеюсь, be_NL никогда не переключится :) - person DonMag; 17.02.2017
comment
@DonMag Точно, отличная информация для добавления к ответу. Он может изменить локаль на любую, которую выберет, чтобы соответствовать моменту использования. - person ; 18.02.2017

Это очень небольшая модификация кода 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;
}
person DonMag    schedule 16.02.2017