2010-09-02 19 views
8

Для того, чтобы получить дни недели я использую:Изменение первого дня недели в NSDateFormatter

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
NSArray *weekdays = [dateFormatter shortWeekdaySymbols]; 

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

Есть ли способ сделать это?

ответ

13

Вы можете получить индекс 1 первого дня недели текущего языка из метода -firstWeekday объекта NSCalendar с текущей локалью. После этого вы можете изменить ваш массив имен неделю соответственно:

// get week day names array 
NSArray *weekdays = self.shortWeekdaySymbols; 

// adjust array depending on which weekday should be first 
NSUInteger firstWeekdayIndex = [NSCalendar currentCalendar].firstWeekday - 1; 
if (firstWeekdayIndex) { 

    NSRange firstRange = NSMakeRange(firstWeekdayIndex, weekdays.count - firstWeekdayIndex); 
    NSRange lastRange = NSMakeRange(0, firstWeekdayIndex); 

    NSArray *firstArray = [weekdays subarrayWithRange:firstRange]; 
    NSArray *lastArray = [weekdays subarrayWithRange:lastRange]; 

    weekdays = [firstArray arrayByAddingObjectsFromArray:lastArray]; 
} 

NSLog(@"%@", weekdays); 

Я не имею iPhone SDK, но AFAIK эти интерфейсы должны быть все имеющиеся там и вести себя так же, как и на OS X.

1

Достигнутые результат, похожий на hasseg в Swift с помощью:

var symbols = dateFormatter.shortWeekdaySymbols as! [String] 
    let firstDayIndex = calendar.firstWeekday - 1 

    if firstDayIndex > 0 { 
     var sub = symbols[0..<firstDayIndex] 
     symbols.removeRange(Range<Int>(start:0, end:firstDayIndex)) 
     symbols += sub 
    } 
0
for i in 0...6 { 
    let day = Calendar.current.weekdaySymbols[(i + Calendar.current.firstWeekday - 1) % 7] 
    print(day) 
} 
1

вроде myexec раствора, но более общий и столь же кратким

let numDays = Calendar.current.weekdaySymbols.count 
let first = Calendar.current.firstWeekday - 1 
let end = first + numDays - 1 

let days = (first...end).map {Calendar.current.weekdaySymbols[$0 % numDays]} 
1

Чтобы изменить начальный день недели, вам необходимо использовать NSCalender.

NSCalendar *_calendar; 
_calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
_calendar.timeZone = [NSTimeZone localTimeZone]; 
[_calendar setFirstWeekday:2];// Sunday == 1, Saturday == 7 
_calendar.locale = [NSLocale currentLocale]; 

    NSDateComponents *dateComponent = [_calendar components:(NSCalendarUnitWeekOfYear | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:[NSDate date]]; 
    NSDate *now = [NSDate date]; 
    NSDateComponents *comp = [_calendar components:NSCalendarUnitYear fromDate:now]; 
    [comp setWeekOfMonth:dateComponent.weekOfYear]; //Week number. 
    [comp setWeekday:2]; 

    NSDate * weekstartPrev = [_calendar dateFromComponents:comp]; 
Смежные вопросы