0

Я должен найти день, что 1-й из каждого месяца приходится на создание пользовательского календаря; например, 1 сентября 2015 года приходится на вторник, что делает вторник в первый день месяца.Как определить локализованный первый день месяца?

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

// build date as start of month 
monthDateComponents.year = components.year; 
monthDateComponents.month = components.month; 
monthDateComponents.day = 1; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDate *builtDate =[gregorian dateFromComponents: monthDateComponents]; 

NSDateFormatter *df = [NSDateFormatter new]; 
[df setDateFormat:@"E"];  
NSString *firstDay = [df stringFromDate:builtDate]; 

// now, convert firstDay to the numeric day number 
if([firstDay isEqual:NSLocalizedString(@"Sun",nil)]) 
    return 7; 
else if([firstDay isEqual:NSLocalizedString(@"Mon",nil)]) 
    return 1; 
else if([firstDay isEqual:NSLocalizedString(@"Tue",nil)]) 
    return 2; 
else if([firstDay isEqual:NSLocalizedString(@"Wed",nil)]) 
    return 3; 
else if([firstDay isEqual:NSLocalizedString(@"Thu",nil)]) 
    return 4; 
else if([firstDay isEqual:NSLocalizedString(@"Fri",nil)]) 
    return 5; 
else if([firstDay isEqual:NSLocalizedString(@"Sat",nil)]) 
    return 6; 

Есть ли лучший способ сделать это, так что я не должен идти через каждую страну и найти то, что 3 символов аббревиатура для каждого дня? (например, по-французски, аббревиатура дня для субботы возвращает «sam.».) Как я теперь это кодировал, мне нужно знать каждый язык, на котором локализовано мое приложение (10 из них), заставляют его работать правильно ,

Заранее спасибо.

+0

Этот код и ваша возникшая проблема не имеют смысла. Какой результат вы пытаетесь получить? Если это локализованная строка, вы уже получаете ее из 'NSDateFormatter'. Если это день недели, то вы не должны включать форматер вообще: получите этот компонент даты из календаря после создания даты входа. –

+0

Привет, Джош ... Я не вижу ни одного компонента даты, который даст мне первый день месяца; компонент дня недели просто даст мне номер дня прошедшей даты. Мне нужно получить номер дня первого дня каждого месяца для создания календаря. Как я указал, он отлично подходит для англоговорящих стран, но не локализован. – SpokaneDude

+0

После создания даты, используя компоненты даты и календарь, вы можете получить любой компонент даты _ для этой даты_ из календаря. Если вам нужен компонент дня недели _ этой даты, вы можете его получить. –

ответ

1

попробуйте это, он использует расчет интеллектуального календаря NSCalendar.

NSDateComponents *components = [NSDateComponents new]; 
    components.day = 1; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    NSDate *firstDayOfMonth = [gregorian nextDateAfterDate:builtDate matchingComponents:components options: NSCalendarMatchNextTime | NSCalendarSearchBackwards]; 
    NSInteger weekdayIndex = [gregorian component:NSCalendarUnitWeekday fromDate:firstDayOfMonth]; 
    NSLog(@"weekday number: %ld", weekdayIndex); 
    return weekdayIndex; 
+0

Это не решает вопрос о локализованной аббревиатуре дня, который затем должен быть преобразован в число дней. – SpokaneDude

+0

Я отредактировал сообщение, чтобы вернуть индекс недели недели, в этом случае локализация не имеет значения. Как упоминалось в другом ответе, в gregorian calendar index 1 есть воскресенье – vadian

+0

Я изменил то, что вы показали, используя weekdayIndex, и он работает ... спасибо. – SpokaneDude

1

Вы хотите:

return [gregorian component:NSCalendarUnitWeekday fromDate:builtDate]; 

Это дает целое число говорит вам день недели для этой даты. 1 - воскресенье.

Смежные вопросы