iOS: convierte UTC NSDate a la zona horaria local

¿Cómo convierto un NSDate UTC a NSDate de zona horaria local en Objective C o / y Swift?

 NSTimeInterval seconds; // assume this exists NSDate* 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 

Tabla de parámetros de cadena de formato:

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

Si el rendimiento es una prioridad, puede considerar usar strftime

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

EDITAR Cuando escribí esto, no sabía que debería usar un formato de fecha, que probablemente sea un mejor enfoque, así que echa un vistazo a la respuesta de slf también.

Tengo un servicio web que devuelve las fechas en UTC. Yo uso toLocalTime para convertirlo a la hora local y toGlobalTime para convertir de nuevo si es necesario.

Aquí es donde obtuve mi respuesta de:

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 

El método más fácil que he encontrado es este:

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

Si quieres la fecha y hora local. Pruebe este código: –

 NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle]; 

Swift 3+ : UTC a Local y Local a UTC

 extension Date { // Convert UTC (or GMT) to local time func toLocalTime() -> Date { let timezone = TimeZone.current let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } // Convert local time to UTC (or GMT) func toGlobalTime() -> Date { let timezone = TimeZone.current let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } } 

Aquí la entrada es una cadena currentUTCTime (en formato 08/30/2012 11:11) convierte el tiempo de entrada en GMT a la hora de la zona configurada por el sistema

 //UTC time NSDateFormatter *utcDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [utcDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"]; [utcDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: 0]]; // utc format NSDate *dateInUTC = [utcDateFormatter dateFromString: currentUTCTime]; // offset second NSInteger seconds = [[NSTimeZone systemTimeZone] secondsFromGMT]; // format it and send NSDateFormatter *localDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [localDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"]; [localDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: seconds]]; // formatted string NSString *localDate = [localDateFormatter stringFromDate: dateInUTC]; return localDate; 

Convierte tu fecha UTC en una fecha local

 -(NSString *)getLocalDateTimeFromUTC:(NSString *)strDate { NSDateFormatter *dtFormat = [[NSDateFormatter alloc] init]; [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [dtFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSDate *aDate = [dtFormat dateFromString:strDate]; [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [dtFormat setTimeZone:[NSTimeZone systemTimeZone]]; return [dtFormat stringFromDate:aDate]; } 

Use Like This

 NSString *localDate = [self getLocalDateTimeFromUTC:@"yourUTCDate"]; 

Convierta la fecha del calendario UTC a una con el NSTimeZone local apropiado .

 //This is basic way to get time of any GMT time. NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"hh:mm a"]; // 09:30 AM [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]]; // For GMT+1 NSString *time = [formatter stringFromDate:[NSDate date]]; // Current time 

Escribo este Método para convertir la hora de la fecha a nuestra LocalTimeZone

-Here (NSString *) El parámetro TimeZone es un servidor de zona horaria

 -(NSString *)convertTimeIntoLocal:(NSString *)defaultTime :(NSString *)TimeZone { NSDateFormatter *serverFormatter = [[NSDateFormatter alloc] init]; [serverFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:TimeZone]]; [serverFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *theDate = [serverFormatter dateFromString:defaultTime]; NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init]; [userFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [userFormatter setTimeZone:[NSTimeZone localTimeZone]]; NSString *dateConverted = [userFormatter stringFromDate:theDate]; return dateConverted; } 

Dado que nadie parecía estar usando NSDateComponents , pensé que lanzaría uno en … En esta versión, no se usa NSDateFormatter , por lo tanto no se analiza el string, y NSDate no se usa para representar el tiempo fuera de GMT (UTC). El NSDate original está en la variable i_date .

 NSCalendar *anotherCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar]; anotherCalendar.timeZone = [NSTimeZone timeZoneWithName:i_anotherTimeZone]; NSDateComponents *anotherComponents = [anotherCalendar components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitNanosecond) fromDate:i_date]; // The following is just for checking anotherComponents.calendar = anotherCalendar; // anotherComponents.date is nil without this NSDate *anotherDate = anotherComponents.date; 

i_anotherCalendar podría ser NSCalendarIdentifierGregorian o cualquier otro calendario. El NSString permitido para i_anotherTimeZone se puede adquirir con [NSTimeZone knownTimeZoneNames] , pero anotherCalendar.timeZone podría ser [NSTimeZone defaultTimeZone] o [NSTimeZone localTimeZone] o [NSTimeZone systemTimeZone] total.

En realidad, es otro anotherComponents mantiene el tiempo en la nueva zona horaria. Notarás que anotherDate es igual a i_date , porque contiene el tiempo en GMT (UTC).

Convierta la hora UTC en la zona horaria actual.

función de llamada

 NSLocale *locale = [NSLocale autoupdatingCurrentLocale]; NSString *myLanguageCode = [locale objectForKey: NSLocaleLanguageCode]; NSString *myCountryCode = [locale objectForKey: NSLocaleCountryCode]; NSString *rfc3339DateTimeString = @"2015-02-15 00:00:00"]; NSDate *myDateTime = (NSDate*)[_myCommonFunctions _ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:myLanguageCode CountryCode:myCountryCode Formated:NO]; 

Función

 -NSObject*)_ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:(NSString *)lgc CountryCode:(NSString *)ctc Formated:(BOOL) formated { NSDateFormatter *sUserVisibleDateFormatter = nil; NSDateFormatter *sRFC3339DateFormatter = nil; NSTimeZone *timeZone = [NSTimeZone defaultTimeZone]; if (sRFC3339DateFormatter == nil) { sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; NSLocale *myPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:[NSString stringWithFormat:@"%@", timeZone]]; [sRFC3339DateFormatter setLocale:myPOSIXLocale]; [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; } // Convert the RFC 3339 date time string to an NSDate. NSDate *date = [sRFC3339DateFormatter dateFromString:rfc3339DateTimeString]; if (formated == YES) { NSString *userVisibleDateTimeString; if (date != nil) { if (sUserVisibleDateFormatter == nil) { sUserVisibleDateFormatter = [[NSDateFormatter alloc] init]; [sUserVisibleDateFormatter setDateStyle:NSDateFormatterMediumStyle]; [sUserVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle]; } // Convert the date object to a user-visible date string. userVisibleDateTimeString = [sUserVisibleDateFormatter stringFromDate:date]; return (NSObject*)userVisibleDateTimeString; } } return (NSObject*)date; } 

Puedes probar este:

 NSDate *currentDate = [[NSDate alloc] init]; NSTimeZone *timeZone = [NSTimeZone defaultTimeZone]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; [dateFormatter setTimeStyle:NSDateFormatterLongStyle]; [dateFormatter setTimeZone:timeZone]; [dateFormatter setDateFormat:@"ZZZ"]; NSString *localDateString = [dateFormatter stringFromDate:currentDate]; NSMutableString *mu = [NSMutableString stringWithString:localDateString]; [mu insertString:@":" atIndex:3]; NSString *strTimeZone = [NSString stringWithFormat:@"(GMT%@)%@",mu,timeZone.name]; NSLog(@"%@",strTimeZone);