iOS: Convert UTC NSDate to local Timezone iOS: Convert UTC NSDate to local Timezone ios ios

iOS: Convert UTC NSDate to local Timezone


NSTimeInterval seconds; // assume this existsNSDate* ts_utc = [NSDate dateWithTimeIntervalSince1970:seconds];NSDateFormatter* df_utc = [[[NSDateFormatter alloc] init] autorelease];[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSString* ts_utc_string = [df_utc stringFromDate:ts_utc];NSString* ts_local_string = [df_local stringFromDate:ts_utc];// you can also use NSDateFormatter dateFromString to go the opposite way

Table of formatting string parameters:

https://waracle.com/iphone-nsdateformatter-date-formatting-table/

If performance is a priority, you may want to consider using strftime

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.html


EDIT When i wrote this I didn't know I should use a dateformatter which is probably a better approach, so check out slf's answer too.

I have a webservice that returns dates in UTC. I use toLocalTime to convert it to local time and toGlobalTime to convert back if needed.

This is where I got my answer from:

https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/

@implementation NSDate(Utils)-(NSDate *) toLocalTime{  NSTimeZone *tz = [NSTimeZone defaultTimeZone];  NSInteger seconds = [tz secondsFromGMTForDate: self];  return [NSDate dateWithTimeInterval: seconds sinceDate: self];}-(NSDate *) toGlobalTime{  NSTimeZone *tz = [NSTimeZone defaultTimeZone];  NSInteger seconds = -[tz secondsFromGMTForDate: self];  return [NSDate dateWithTimeInterval: seconds sinceDate: self];}@end


The easiest method I've found is this:

NSDate *someDateInUTC = …;NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];