Question

I have the following code to set the time on a date to 0 hours, 0 minutes, 0 seconds by using the YEAR, MONTH and DAY components from the date to construct a new one:

NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:date];
NSDate *newDate = [gregorian dateFromComponents:comps];
NSLog(@"date: %@, newDate: %@", date, newDate);

The output is:

date: 2012-11-06 11:44:09 +0000, newDate: 2012-11-05 23:00:00 +0000

but I was expecting the new date to be: 2012-11-06 00:00:00 +0000 What's happening that I should know of?

Was it helpful?

Solution

NSLog shows the dates using -[NSDate description] which, in turn, converts the absolute time stored in the NSDate to a string. This conversion is done using UTC as the time zone.

For you case it's probably best to do the date calculations in UTC as well. To do so adjust the calendar object that does the calculations:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

OTHER TIPS

See this answer for a similar Stack Overflow question.

This should solve your issue with daylight savings:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];

[formatter setCalendar:[NSCalendar currentCalendar]];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSString *string = [formatter stringFromDate:[NSDate date]];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top