2011-03-24 14 views
13

tengo esta categoría añadida a NSDate: funciónDetectar si NSDate contiene un día de fin de semana

- (bool)isWeekend 
{ 
    NSString* s = [self asString:@"e"]; 

    if ([s isEqual:@"6"]) 
    return YES; 
    else if ([s isEqual:@"7"]) 
    return YES; 
    else 
    return NO; 
} 

Ayudante:

- (NSString*)asString:(NSString*)format 
{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:format]; 
    NSString *formattedDateString = [dateFormatter stringFromDate:self]; 
    [dateFormatter release]; 

    return formattedDateString; 
} 

isWeekend debería devolver SÍ si es un sábado o un domingo. Pero no funciona si la configuración regional tiene una semana de inicio un domingo, en cuyo caso el viernes será el día 6 y el sábado será el día 7.

¿Cómo puedo solucionar esto?

+1

¿Es seguro asumir que 'AsString:' crea un NSDateFormatter con el formato de fecha especificado, entonces se corre el NSDate ¿a traves de? – Tommy

Respuesta

23

que desea utilizar NSCalendar y NSDateComponents:.

NSDate *aDate = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSRange weekdayRange = [calendar maximumRangeOfUnit:NSWeekdayCalendarUnit]; 
NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:aDate]; 
NSUInteger weekdayOfDate = [components weekday]; 

if (weekdayOfDate == weekdayRange.location || weekdayOfDate == weekdayRange.length) { 
    //the date falls somewhere on the first or last days of the week 
    NSLog(@"weekend!"); 
} 

Esto está operando bajo la suposición de que el primer y último día de la semana comprenden los "fines de semana" (lo cual es cierto para el calendario gregoriano puede no ser cierto en otros calendarios).

+1

No esperaba que esta solución funcionara. Pero lo hace. :-) Para locales que comienzan la semana en domingo, así como aquellos que comienzan en lunes. Debo admitir que no entiendo el maximumRangeOfUnit :. – Kobski

+1

@Kobski el 'maximumRangeOfUnit:' es básicamente para saber cuántos días hay en una semana. –

+0

@ dave-delong Gracias por tomarse el tiempo para aclarar esto, pero ¿no sería siempre 7? Agregué un código de depuración solo para ver los valores y para las configuraciones regionales que he probado, la ubicación es 1 y la longitud es 7. Pero ¿por qué debe de ser weekdayOfDate 1 o 7 para que sea un fin de semana? – Kobski

11

A partir de iOS 8, puede usar isDateOnWeekend: en NSCalendar.

4

En Swift:

func isWeekend(date: NSDate) -> Bool { 
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
    return calendar.isDateInWeekend(date) 
} 
5

En Swift 3+:

extension Date { 
    var isWeekend: Bool { 
    return NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!.isDateInWeekend(self) 
    } 
} 
+1

¡yay! para swift vs objc ... – Yohst

+0

@Yohst ha, sí! Swift puede ser bastante conciso :) –

Cuestiones relacionadas