Получение первого дня недели с NSDateComponents: смена года - PullRequest
13 голосов
/ 18 марта 2011

Hello У меня проблема с настройкой firstWeekDay, вот что я делаю:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:targetDate];
[comp setWeekday:2];

NSDate *firstWeekDay = [gregorian dateFromComponents:comp];

Если суббота 2011-01-01 является targetDate, первый день недели в моем календаре будет понедельник 2011-12-26, но на самом деле это должен быть понедельник 2010-12-26. Как я могу сделать это правильно?

Ответы [ 7 ]

35 голосов
/ 07 января 2012

Чтобы устранить эту проблему, добавьте NSYearForWeekOfYearCalendarUnit в NSDateComponents.

Ex:

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate];

[comps setWeekday:2]; // 2: monday
firstDayOfTheWeek = [calendar dateFromComponents:comps];
[comps setWeekday:7]; // 7: saturday
lastDayOfTheWeek = [calendar dateFromComponents:comps];
1 голос
/ 27 октября 2015

Вы предполагаете использовать динамические значения вместо жесткого кодирования 2, как понедельник!

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];

comps.weekday = calendar.firstWeekday;
firstDayOfTheWeek = [calendar dateFromComponents:comps];
comps.weekday = calendar.firstWeekday - 1;
lastDayOfTheWeek = [calendar dateFromComponents:comps];
1 голос
/ 20 ноября 2014

Решение Swift (спасибо @YvesJusot):

let calendar = NSCalendar.currentCalendar()
let comps = calendar.components(NSCalendarUnit.WeekOfYearCalendarUnit|NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.WeekCalendarUnit|NSCalendarUnit.WeekdayCalendarUnit, fromDate: NSDate()) as NSDateComponents

comps.setValue(2, forComponent: NSCalendarUnit.WeekdayCalendarUnit)
let monday = calendar.dateFromComponents(comps)!

println("\(monday)")
1 голос
/ 19 января 2014

Ниже также охватывает край корпуса,

- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];


   NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
    [components setWeekday:2]; // 1 == Sunday, 7 == Saturday
    if([[calendar dateFromComponents:components] compare: curDate] == NSOrderedDescending) // if start is later in time than end
    {
        [components setWeek:[components week]-1];
    }

    return [calendar dateFromComponents:components];
}
1 голос
/ 18 марта 2011

Попробуйте это

// adjust them for first day of previous week (Monday)
[comp setWeekday:2];
[comp setWeek:([comp week] - 1)];

Обратите внимание, что это решение предполагает, что первым днем ​​недели является понедельник.

0 голосов
/ 09 июня 2017
// Make these two methods as categories to NSDate
// Use This to get First date of the week (Monday)

- (NSDate *) getFirstDayOfWeek {

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSDateComponents *compOfDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday) fromDate:self];

    NSInteger numOfDaysToAdd = compOfDate.weekday == 1 ? -6 : (2 - compOfDate.weekday);

    NSDateComponents *compToAdd = [[NSDateComponents alloc] init];

    compToAdd.day = numOfDaysToAdd;

    return [calendar dateByAddingComponents:compToAdd toDate:self options:0];
}

// Use This to get last date of the week (Sunday)

- (NSDate *)getLastDayOfWeek {

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSDateComponents *compOfDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday) fromDate:self];

    NSInteger numOfDaysToAdd = compOfDate.weekday == 1 ? 0 : (8 - compOfDate.weekday);

    NSDateComponents *compToAdd = [[NSDateComponents alloc] init];

    compToAdd.day = numOfDaysToAdd;

    return [calendar dateByAddingComponents:compToAdd toDate:self options:0];
}
0 голосов
/ 31 июля 2015

Я внес некоторые изменения в ответ @JasonGarrett, и он работает для меня.

let calendar = NSCalendar.currentCalendar()
let flags : NSCalendarUnit = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear
let comps = calendar.components(flags, fromDate: NSDate()) as NSDateComponents
                comps.setValue(2, forComponent: NSCalendarUnit.CalendarUnitWeekday)
let monday = calendar.dateFromComponents(comps)!
...