将UTC NSDate转换为本地时区Objective-C

如何在目标C中将UTC NSDate转换为本地时区NSDate?

 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 

格式化string参数表格:

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

如果性能是一个优先事项,你可能要考虑使用strftime

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

编辑当我写这个,我不知道我应该使用dateformatter这可能是一个更好的办法,所以检查出slf的答案了。

我有一个web服务,返回UTC的date。 我使用toLocalTime将其转换为本地时间,并toGlobalTime如果需要转换回来。

这是我从我的答案:

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 

我find的最简单的方法是这样的:

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

如果你想要本地的date和时间。 试试这个代码:

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

这里的input是一个stringcurrentUTCTime(格式为08/30/2012 11:11)将GMT中的input时间转换为系统设置的区域时间

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

将 UTC日历中的date转换为适当的本地NSTimeZone 。

将您的UTCdate转换为本地date

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

像这样使用

 NSString *localDate = [self getLocalDateTimeFromUTC:@"yourUTCDate"]; 
 //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 

我写这个方法将date时间转换为我们的LocalTimeZone

– 这里(NSString *)TimeZone参数是服务器时区

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

Swift 3 :UTC到本地和本地到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) } } 

由于没有人似乎使用NSDateComponents ,我想我会在…中的版本中,没有使用NSDateFormatter ,因此没有stringparsing, NSDate不用于代表GMT(UTC)以外的时间。 原始NSDate位于variablesi_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可以是NSCalendarIdentifierGregorian或任何其他日历。 可以使用[NSTimeZone knownTimeZoneNames]获取i_anotherTimeZone允许的NSString ,但[NSTimeZone knownTimeZoneNames]可以是[NSTimeZone defaultTimeZone][NSTimeZone localTimeZone][NSTimeZone systemTimeZone]

实际上是anotherComponents在新时区的时间。 您会注意到anotherDate等于i_date ,因为它在GMT(UTC)中保存时间。

将UTC时间转换为当前时区。

通话function

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

function

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