Getting the last day of the month

How can I get the last day of the current month as NSDate ?

+47
date objective-c cocoa-touch cocoa nsdate
May 05 '10 at 10:28
source share
8 answers
 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); 

should also work.

+68
Dec 19 2018-10-19
source share
 // 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); 
+40
Dec 22 '10 at 4:13
source share

Put it in the category:

 -(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; } 
+9
Oct 20 '13 at 12:21
source share

Quick version

 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)! } } 
+2
Dec 03 '15 at 18:56
source share

IOS version 7

just to get rid of omissions ... with a minor addition to get the last second of the day.

  // 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]; 
0
Jan 08 '16 at 10:56 on
source share

Swift Version 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)! } } 
0
Jan 10 '17 at 7:15
source share

With Swift 3 and iOS 10, the easiest way to find this is 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:) end date returns the beginning of the following month return DateInterval(start: interval.start, duration: duration - 1) } guard let interval = monthInterval() else { return } 

Then you can use interval.start and interval.end to get the dates you need.

0
May 09 '17 at 1:49 am
source share

Workaround:

 -(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; } 
-2
May 05 '10 at 10:51
source share



All Articles