iOS: converta o NSDate UTC para o fuso horário local

Como faço para converter um NSDate UTC para NSDate de fuso horário local em Objective C ou / e 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 

Tabela de parâmetros de string de formatação:

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

Se o desempenho é uma prioridade, você pode querer considerar o uso de strftime

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

Quando eu escrevi isso eu não sabia que deveria usar um formato de data que é provavelmente uma abordagem melhor, então confira a resposta do slf também.

Eu tenho um webservice que retorna datas no UTC. Eu uso toLocalTime para convertê-lo para a hora local e para toGlobalTime para converter de volta, se necessário.

Aqui é onde eu recebi minha resposta:

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 

O método mais fácil que encontrei é este:

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

Se você quiser data e hora local. Tente este código: –

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

Swift 3+ : UTC para local e local para 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) } } 

Aqui a input é uma string currentUTCTime (no formato 08/30/2012 11:11) converte o tempo de input em GMT para o tempo de zona definido pelo 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; 

Converta sua data UTC em Data 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 assim

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

Converta a data do calendar UTC em uma com o NSTimeZone local apropriado.

 //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 

Eu escrevo este método para converter data e hora em nosso LocalTimeZone

-Here (NSString *) O parâmetro TimeZone é um fuso horário do servidor

 -(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; } 

Como ninguém parecia estar usando o NSDateComponents , pensei em lançar um … Nesta versão, nenhum NSDateFormatter é usado, portanto, nenhuma análise de sequência e NSDate não é usado para representar o tempo fora do GMT (UTC). O NSDate original está na variável 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 pode ser NSCalendarIdentifierGregorian ou qualquer outro calendar. O NSString permitido para i_anotherTimeZone pode ser adquirido com [NSTimeZone knownTimeZoneNames] , mas anotherCalendar.timeZone pode ser [NSTimeZone defaultTimeZone] ou [NSTimeZone localTimeZone] ou [NSTimeZone systemTimeZone] completamente.

Na verdade, é outro anotherComponents detém o tempo no novo fuso horário. Você notará que anotherDate é igual a i_date , porque é válido em GMT (UTC).

Converte a hora UTC para o fuso horário atual.

function de chamada

 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]; 

Função

 -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; } 

Você pode tentar 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);