2013-03-06 4 views
13

Hier ist das Problem, ich suche nach einer Möglichkeit, die Anzahl der Wochen in einem Monat zu bekommen. Ich finde bereits eine Lösung, die auf ios 5 zu funktionieren scheint, aber nicht auf io6 (die zurückgegebene Nummer ist nicht dieselbe, eine weitere auf ios 6).Wie bekomme ich die Anzahl der Wochen in einem Monat

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

Der zurückgegebene Wert ist 6 auf io6 und 5 auf io5.

Haben Sie eine Idee?

EDIT: Eine andere Sache, mein Gerät (ios5) ist in Französisch und der Simulator (ios6) ist in Englisch. Vielleicht kann es etwas ändern (wie der erste Tag der Woche?)?

+0

Sogar in osx sagt es 6. was korrekt ist zählen. –

+0

Was ist der Monat und das Jahr, die Sie versuchen, das Problem zu zeigen? – occulus

+0

Überprüfen Sie meinen aktualisierten Code, und ich überprüfe es in Osx und iOS6, es funktioniert gut. –

Antwort

15

Versuchen Sie dieses:

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) 

Oder ändern Sie Ihre Methode:

- (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:

Verwendung dieses in obigem Verfahren

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

Vielen Dank für Ihren Code, aber das Ergebnis ändert sich nicht, ich habe immer noch 5 auf meinem Gerät (iOS5) und 6 auf Simulator (iOS6). Ich habe eine Sache vergessen, vielleicht ist es ein Lokalisierungsproblem, vielleicht in Französisch (wie mein Gerät ist) Woche beginnt am Montag (was ich will), aber nicht auf Englisch? –

+0

Da geht es, das ist das Problem, aber Sie haben eine kürzere Lösung oben. –

+0

Überprüfen Sie meine bearbeitete Antwort; –

0

dieser Ansatz prüfen.

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

diese Methode Hinzufügen dann die Kategorie der NSDate wird den Wochentag von jedem Datum zurück, die in der gleichen Woche liegt.

Mit freundlichen Grüßen.