Search code examples
objective-cnsdatenscalendarnsdatecomponents

Objective C: Incorrect Output while using NSDates


I am trying to get the start and end dates of the current month. There are a few similar questions here, but I am getting unexpected results while using them. Here's what I did:

NSDate *monthStart,*monthEnd;   
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];          
NSDateComponents *comps = [cal components:NSDayCalendarUnit fromDate:[NSDate date]];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
monthStart = [cal dateFromComponents:comps];
[comps setDay:[[NSCalendar currentCalendar]
               rangeOfUnit:NSDayCalendarUnit
               inUnit:NSMonthCalendarUnit
               forDate:[NSDate date]].length];
[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];
monthEnd = [cal dateFromComponents:comps];
NSLog(@"%@",monthStart);
NSLog(@"%@",monthEnd);

Unfortunately the output is :

2012-12-24 15:39:28.159 Popup[1010:403] 0001-12-31 18:06:32 +0000
2012-12-24 15:39:28.160 Popup[1010:403] 0001-01-31 18:06:31 +0000

BTW, the timezone configured in my machine is +5:30


Solution

  • I have modified your code little, to get the correct answer

    NSDate *monthStart,*monthEnd;
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:currentDate];
    [comps setDay:1];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:19800]];
    monthStart = [cal dateFromComponents:comps];
    
    
    [comps setDay:[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length];
    [comps setHour:23];
    [comps setMinute:59];
    [comps setSecond:59];
    monthEnd = [cal dateFromComponents:comps];
    
    NSLog(@"Start %@",monthStart);
    NSLog(@"End   %@",monthEnd);