objective-c cocoa-touch cocoa date nsdate

objective c - Obteniendo el último día de un mes



objective-c cocoa-touch (8)

¿Cómo puedo obtener el último día del mes actual como NSDate ?


Versión Swift

extension NSDate { func lastDayOfMonth() -> NSDate { let calendar = NSCalendar.currentCalendar() let dayRange = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: self) let dayCount = dayRange.length let comp = calendar.components([.Year, .Month, .Day], fromDate: self) comp.day = dayCount return calendar.dateFromComponents(comp)! } }


Con Swift 3 y iOS 10, la forma más fácil que encontré para hacerlo es Calendar dateInterval(of:for:) :

func monthInterval() -> DateInterval? { let calendar = Calendar.current guard let interval = calendar.dateInterval(of: .month, for: Date()) else { return nil } let duration = interval.duration // Subtract one second because dateInterval(of:for:)''s end date returns the beginning of the following month return DateInterval(start: interval.start, duration: duration - 1) } guard let interval = monthInterval() else { return }

Luego puede usar interval.start e interval.end para obtener las fechas que necesita.


Función de solución:

-(int)GetLastDayOfMonth:(NSDate *)date { int last_day = 27; NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *compsMonth = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date]; [compsMonth setDay:last_day]; int month = [compsMonth month]; while(TRUE){ [compsMonth setDay:last_day+1]; NSDate *dateFuture = [cal dateFromComponents:compsMonth]; NSDateComponents *futureComps = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:dateFuture]; if(month != [futureComps month]){ return last_day; } last_day+=1; } return last_day; }


Pon esto en una categoría:

-(NSDate*)lastDayOfMonth { NSInteger dayCount = [self numberOfDaysInMonthCount]; NSDateComponents *comp = [[self calendar] components: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:self]; [comp setDay:dayCount]; return [[self calendar] dateFromComponents:comp]; } -(NSInteger)numberOfDaysInMonthCount { NSRange dayRange = [[self calendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self]; return dayRange.length; } -(NSCalendar*)calendar { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [calendar setTimeZone:[NSTimeZone timeZoneWithName:TIMEZONE]]; return calendar; }


Versión de Swift 3.0.1

extension Date { func lastDayOfMonth() -> Date { let calendar = NSCalendar.current let dayRange = calendar.range(of: .day, in: .month, for: self) let dayCount = dayRange?.count var comp = calendar.dateComponents([.year, .month, .day], from: self) comp.day = dayCount return calendar.date(from: comp)! } }


Versión de iOS 7

solo para deshacerse de las desaprobaciones ... con una pequeña adición para obtener el último segundo del día.

// current date NSDate *now = [NSDate new]; // get last day of the current month NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; [calendar setTimeZone:[NSTimeZone systemTimeZone]]; NSRange dayRange = [ calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:now]; NSInteger numberOfDaysInCurrentMonth = dayRange.length; NSDateComponents *comp = [calendar components: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:now]; comp.day = numberOfDaysInCurrentMonth; comp.hour = 24; comp.minute = 0; comp.second = 0; NSDate *endOfMonth = [calendar dateFromComponents:comp];


// Adapted from running code in my app NSDate *curDate = [NSDate date]; NSCalendar *currentCalendar = [NSCalendar currentCalendar]; NSRange daysRange = [currentCalendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:curDate]; // daysRange.length will contain the number of the last day // of the month containing curDate NSLog(@"%i", daysRange.length);


NSDate *curDate = [NSDate date]; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* comps = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate]; // Get necessary date components // set last of month [comps setMonth:[comps month]+1]; [comps setDay:0]; NSDate *tDateMonth = [calendar dateFromComponents:comps]; NSLog(@"%@", tDateMonth);

también debería funcionar