12
votes

Obtenir le premier jour d'une semaine avec NsdatEcomponents: année en mutation

bonjour J'ai un problème avec la définition d'un premier jour, voici ce que je fais:

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

NSDate *firstWeekDay = [gregorian dateFromComponents:comp];


1 commentaires

Est-ce peut-être la raison pour laquelle le réveil dans iOS n'a pas fonctionné correctement pour certains utilisateurs de 2011-01-01?


7 Réponses :


1
votes

Essayez ceci

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


1 commentaires

Merci, mais votre méthode ne fonctionne pas. Le premier jour est devenu devenu 2011-12-20



35
votes

Pour résoudre ce problème, ajoutez Nsyearfeeakekofyearcalendarunit dans les NsdatEcomponents.

ex: xxx


4 commentaires

C'était une solution. Si vous avez encore un problème et que NsdayCalendarunit a utilisé, essayez ensuite de le supprimer.


Pourquoi avez-vous besoin de "nsyearforweekofyearcalendarunit"? Qu'est ce que ça fait?


@Raj, hehe, il a fait votre "jour" ;-)!


En effet, jamais réalisé! :RÉ



1
votes

ci-dessous couvre également le boîtier de bord, xxx


0 commentaires

1
votes

La solution Swift (merci @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)")


0 commentaires

0
votes

J'ai fait des changements dans la réponse @jasongarrett et cela fonctionne pour moi. XXX


0 commentaires

1
votes

Vous supposez utiliser des valeurs dynamiques au lieu d'un code de codage 2 comme lundi!

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];


0 commentaires

0
votes
// 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 commentaires