2017-01-24 2 views
1

Ich bin derzeit eine alte iOS App zu aktualisieren, die NSDateComponents das Startdatum der Woche eine gegebene NSDate zur Berechnung verwendet, ist in:NSDateComponents: Wie veraltete NSWeekCalendarUnit zu Kalkulationswoche Startdatum ersetzen?

NSDate* someDate = [MyDateFactory dateFromDay:31 month:8 year:2017]; 

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit) fromDate:someDate]; 

// For 2017-08-31 comps is now year=2017, week (obsolete)=35 

comps.calendar = calendar; 
NSDate* weekStartDate = [comps date]; 

// weekStartDate = 2017-08-27 

Dies funktioniert gut, aber NSYearCalendarUnit und NSWeekCalendarUnit sind beide veraltet. Ersetzen NSYearCalendarUnit durch die neue ist kein Problem. Aber was es richtig ersetzt für NSWeekCalendarUnit.

Es scheint, dass NSWeekCalendarUnit den gleichen Wert (die Woche des Jahres) wie die neue NSCalendarUnitWeekOfYear zurückgibt. Aber dies führt nicht in den gleichen weekStartDate:

// ... same as above. Now use new enum values 
NSDateComponents *comps = [calendar components:(NSCalendarUnitYear | NSCalendarUnitWeekOfYear) fromDate:someDate]; 

// For 2017-08-31 comps is now year=2017, week of year=35 <== Same es above 

comps.calendar = calendar; 
NSDate* weekStartDate = [comps date]; 

// weekStartDate = 2017-01-01 

So NSCalendarUnitWeekOfYear kehrt die gleiche Woche Wert (Woche 35) verwendet wird, aber es scheint, dass dieser Wert nicht berücksichtigt wird, wenn das Datum aus dem dem NSDateComponents Objekt Berechnung . 2017-01-01 ist offensichtlich nicht das Datum Woche 35 beginnt im Jahr 2017.

Also, wie das zu lösen?

Antwort

0

Sie können stattdessen andere Methoden von NSCalendar verwenden.

Um den Tag zu erhalten, an dem die Wochen beginnen, verwenden Sie calendar.firstWeekday.

Dann legen diese in einige aktuellen Komponenten:

NSDateComponents *search = [[NSDateComponents alloc] init]; 
search.weekDay = calendar.firstWeekday; 

Jetzt können Sie den Kalender verwenden, um das vorherige Datum zu finden, die die Komponenten übereinstimmt:

NSDate *weekStart = [calendar nextDateAfterDate: someDate matchingComponents: search options: NSCalendarSearchBackwards]; 
Verwandte Themen