2013-03-06 13 views
13

Tutaj jest problem, szukam sposobu na uzyskanie liczby tygodni w miesiącu. Już znajduję rozwiązanie, które wydaje się działać na ios 5, ale nie na io6 (zwrócona liczba nie jest taka sama, jedna więcej na ios 6).Jak uzyskać liczbę tygodni w miesiącu

- (int)weeksOfMonth:(int)month inYear:(int)year 
{ 
    NSCalendar *cCalendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    [components setMonth:month]; 
    [components setYear:year]; 

    NSRange range = [cCalendar rangeOfUnit:NSDayCalendarUnit 
           inUnit:NSMonthCalendarUnit 
           forDate:[cCalendar dateFromComponents:components]]; 

    cCalendar = [NSCalendar currentCalendar]; 
    [cCalendar setMinimumDaysInFirstWeek:4]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier:@"fr"]]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
    NSMutableSet *weeks = [[NSMutableSet alloc] init ]; 

    for(int i = 0; i < range.length; i++) 
    { 
     NSString *temp = [NSString stringWithFormat:@"%4d-%2d- %2d",year,month,range.location+i]; 
     NSDate *date = [dateFormatter dateFromString:temp ]; 
     int week = [[cCalendar components: NSWeekOfYearCalendarUnit fromDate:date] weekOfYear]; 
     [weeks addObject:[NSNumber numberWithInt:week]]; 
    } 

    return [weeks count]; 
} 

Zwracana wartość to 6 na io6 i 5 na io5.

Masz jakiś pomysł?

EDYCJA: Kolejna rzecz, moje urządzenie (ios5) jest w języku francuskim, a symulator (ios6) jest w języku angielskim. Może może coś zmienić (np. Pierwszy dzień tygodnia?)?

+0

Nawet w osxie jest napisane 6. co jest poprawną liczbą. –

+0

Jaki jest miesiąc i rok próby, która pokazuje problem? – occulus

+0

Sprawdź mój zaktualizowany kod, i sprawdzam go w osxie i ios6, działa dobrze. –

Odpowiedz

15

Spróbuj tego:

NSDate *date = [NSDate date];//since you are forming date, put it here 
NSCalendar *calender = [NSCalendar currentCalendar]; 
NSRange weekRange = [calender rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; 
NSInteger weeksCount=weekRange.length; 
NSLog(@"%d",weeksCount); 

Swift 4.0:

let date = Date() 
let calendar = Calendar.current 
let weekRange = calendar.range(of: .weekOfMonth, 
           in: .month, 
           for: date) 
let weeksCount = weekRange.count ?? 0 
print(weeksCount) 

stonie metody do:

- (NSInteger)weeksOfMonth:(int)month inYear:(int)year{ 
    NSString *dateString=[NSString stringWithFormat:@"%4d/%d/1",year,month]; 

    NSDateFormatter *dfMMddyyyy=[NSDateFormatter new]; 
    [dfMMddyyyy setDateFormat:@"yyyy/MM/dd"]; 
    NSDate *date=[dfMMddyyyy dateFromString:dateString]; 

    NSCalendar *calender = [NSCalendar currentCalendar]; 
    NSRange weekRange = [calender rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; 
    NSInteger weeksCount=weekRange.length; 

    return weeksCount; 
} 

EDIT:

wykorzystanie tego w powyższym sposobie

//NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[calender setFirstWeekday:2]; //sunday=1, monday=2 etc 
+0

Dziękuję za Twój kod, ale wynik się nie zmienia, wciąż mam 5 na moim urządzeniu (ios5) i 6 na symulatorze (ios6). Zapomniałem jednej rzeczy, może to problem z lokalizacją, może po francusku (jak moje urządzenie) tydzień zaczyna się w poniedziałek (czego chcę), ale nie po angielsku? –

+0

Proszę bardzo, to jest problem, jednak macie krótsze rozwiązanie powyżej. –

+0

Sprawdź moją zredagowaną odpowiedź; –

0

Zaznacz to podejście.

-(NSArray*)getWeekDaysForDate { 


int dayOfWeek = [self weekDay]; 

NSMutableArray *array = [NSMutableArray array]; 

NSDate *weekStartDate = [self offsetDay:1-dayOfWeek]; 

NSCalendar *calendar = [NSCalendar defaultCalendar]; 
NSInteger monthValue = [self month]; 
unsigned int weekNum = [[calendar components: NSWeekCalendarUnit 
           fromDate: weekStartDate] week]; 
NSDate * nextDate = weekStartDate, *curDate; 
NSDateComponents *oneDay = [[NSDateComponents alloc] init]; 
[oneDay setDay:1]; 
unsigned int newWeekNum; 
do { 
    curDate = nextDate; 
    nextDate = [calendar dateByAddingComponents:oneDay toDate: curDate 
            options:0]; 

    newWeekNum = [[calendar components: NSWeekCalendarUnit fromDate: 
        nextDate] week]; 
    int monthValueForNextDate = [[calendar components: NSMonthCalendarUnit fromDate: 
         nextDate] month]; 

    if(monthValue == monthValueForNextDate) 
     [array addObject:nextDate]]; 

} while (newWeekNum == weekNum); 

[array sortUsingSelector:@selector(compare:)]; 

return array; 
} 

-(int)month { 
    NSCalendar *gregorian = [NSCalendar defaultCalendar]; 
    NSDateComponents *components = [gregorian components:NSMonthCalendarUnit fromDate:self]; 
    return [components month]; 
} 

-(int)weekDay { 
    NSCalendar *gregorian = [NSCalendar defaultCalendar]; 
    NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit fromDate:self]; 
    return [components weekday]; 
} 

-(NSDate *)offsetDay:(int)numDays { 
    NSCalendar *gregorian = [NSCalendar defaultCalendar]; 
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
    [offsetComponents setDay:numDays]; 
    return [gregorian dateByAddingComponents:offsetComponents 
            toDate:self options:0]; 
} 

PS: NSCalendar defaultCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

Dodanie tej metody to kategoria NSDate powróci dni tygodnia o dowolnej dacie, która znajduje się w tym samym tygodniu.

Pozdrawiam.

Powiązane problemy