2013-08-29 7 views
3

После поиска SO, но кроме this question Я не нашел решений. Я думаю о создании метода, который бы принять int в номер недели и int года и что будет возвращать NSString с названием месяца:Преобразуйте номер недели в течение определенного года в месяц.

- (NSString *)getMonthNameFromNumber:(int)weekNumber andYear:(int)year

Но я не могу найти способ приблизиться к этой проблеме. Был бы рад, если бы кто-нибудь мог помочь с советами.

+2

NSDateComponents может быть полезным. – Larme

+0

Используйте NSDateFormatter 'monthSymbols' вместо' setDateFormat'. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDateFormatter/monthSymbols –

ответ

4

Что-то, как это будет делать

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year { 
    NSDateComponents * dateComponents = [NSDateComponents new]; 
    dateComponents.year = year; 
    dateComponents.weekOfYear = week; 
    dateComponents.weekday = 1; // 1 indicates the first day of the week, which depends on the calendar 
    NSDate * date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMMM"]; 
    return [formatter stringFromDate:date]; 
} 

Обратите внимание, что это зависит от текущего календаря, установленного в настройках устройства.

В случае, если это не соответствует вашим потребностям, вы можете предоставить экземпляр NSCalendar и использовать его для получения даты вместо currentCalendar. Поступая таким образом, вы можете настроить такие вещи, как первый день недели и т. Д. documentation из NSCalendar стоит прочитать.

При использовании пользовательского календаря является общим случаем, просто изменить реализацию на что-то вроде

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year { 
    [self monthNameForWeek:week inYear:year calendar:[NSCalendar currentCalendar]]; 
} 

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year calendar:(NSCalendar *)calendar { 
    NSDateComponents * dateComponents = [NSDateComponents new]; 
    dateComponents.year = year; 
    dateComponents.weekOfYear = week; 
    dateComponents.weekday = 1; // 1 indicates the first day of the week, which depends on the calendar 
    NSDate * date = [calendar dateFromComponents:dateComponents]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMMM"]; 
    return [formatter stringFromDate:date]; 
} 

Как несвязанной стороне записки, вы должны избегать get имен методов, если вы не возвращаются значение косвенно.

+0

... который должен вернуться название месяца, в который падает первый день недели. Вы можете использовать другие компоненты даты, чтобы продвинуться на 6 дней и проверить последний день недели, если вас беспокоят недели, которые охватывают месяцы. Также будьте готовы к несколько разным ответам в разных регионах - понедельник - начало недели в большинстве стран мира, но в США - воскресенье. Я ожидаю, что Apple учтет это, когда вы говорите о том, когда начнется неделя N. – Tommy

+0

Это не работает, я возвращаюсь обратно – WDUK

+0

Извините, что я получил неправильную дату. Исправлено: –

2

Что-нибудь связанное с датами, вам нужно включить календарь. Ваш вопрос предполагает, григорианский календарь, но я предлагаю вам изменить объявление метода в:

- (NSString*)monthNameFromWeek:(NSInteger)week year:(NSInteger)year calendar:(NSCalendar*)cal; 

Из этого, есть также неоднозначность в какой день мы говорим о. Например (это не было проверено), неделя 4 2015 года может содержать как январь, так и февраль. Какой из них правильный? В этом примере мы будем использовать будний день в 1, что указывает на воскресенье (в градостроительном календаре Великобритании), и мы будем использовать любой месяц, в который он попадает.

Таким образом, ваш код будет:

// Set up our date components 
NSDateComponents* comp = [[NSDateComponents alloc] init]; 
comp.year = year; 
comp.weekOfYear = week; 
comp.weekday = 1; 

// Construct a date from components made, using the calendar 
NSDate* date = [cal dateFromComponents:comp]; 

// Create the month string 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMMM"]; 
return [dateFormatter stringFromDate:date]; 
Смежные вопросы