将GMT NSDate转换为设备当前的时区

我正在使用Parse.com来存储一些值:

在这里输入图像说明

这些是GMT值。 如何将这些转换为设备的当前时区,并获得NSDate?

NSDate总是以GMT表示。 这只是你如何表示,可能会改变。

如果要将date打印到label.text ,则使用NSDateFormatter[NSTimeZone localTimeZone]将其转换为string,如下所示:

 NSString *gmtDateString = @"08/12/2013 21:01"; NSDateFormatter *df = [NSDateFormatter new]; [df setDateFormat:@"dd/MM/yyyy HH:mm"]; //Create the date assuming the given string is in GMT df.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; NSDate *date = [df dateFromString:gmtDateString]; //Create a date string in the local timezone df.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone localTimeZone].secondsFromGMT]; NSString *localDateString = [df stringFromDate:date]; NSLog(@"date = %@", localDateString); // My local timezone is: Europe/London (GMT+01:00) offset 3600 (Daylight) // prints out: date = 08/12/2013 22:01 

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

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

这是将NSDate更改为本地时区date的非常干净的方法

 extension NSDate { func toLocalTime() -> NSDate { let timeZone = NSTimeZone.local let seconds : TimeInterval = Double(timeZone.secondsFromGMT(for:self as Date)) let localDate = NSDate(timeInterval: seconds, since: self as Date) return localDate } } 

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

像下面这样创build一个Xcodetesting用例可能会帮助我们“永远”记住这些规则:

 - (void)test2015_05_23_07_07_07_Toronto { NSString *utcDateString = @"2015_05_23 12:07:07"; NSDateFormatter *dateFormatter = [NSDateFormatter new]; dateFormatter.dateFormat = @"yyyy_MM_dd HH:mm:ss"; dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; NSDate *date2015_05_23_12_07_07_UTC = [dateFormatter dateFromString:utcDateString]; XCTAssertTrue([date2015_05_23_12_07_07_UTC.description isEqualToString:@"2015-05-23 12:07:07 +0000"]); dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"EST"]; NSString *torontoDateString = [dateFormatter stringFromDate:date2015_05_23_12_07_07_UTC]; XCTAssertTrue([torontoDateString isEqualToString:@"2015_05_23 07:07:07"]); // change format to add ZZZ dateFormatter.dateFormat = @"yyyy_MM_dd HH:mm:ss ZZZ"; torontoDateString = [dateFormatter stringFromDate:date2015_05_23_12_07_07_UTC]; XCTAssertTrue([torontoDateString isEqualToString:@"2015_05_23 07:07:07 -0500"]); XCTAssertEqual(1432382827, [date2015_05_23_12_07_07_UTC timeIntervalSince1970]); NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar]; calendar.timeZone = [NSTimeZone timeZoneWithName:@"EST"]; NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:date2015_05_23_12_07_07_UTC]; XCTAssertEqual(2015, components.year); XCTAssertEqual(5, components.month); XCTAssertEqual(23, components.day); XCTAssertEqual(7, components.hour); XCTAssertEqual(7, components.minute); XCTAssertEqual(7, components.second); } 

你可以使用NSDateFormatter来实现这个结果。

 NSString *dateAsString = @"08/07/2013 04:06"; NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd/MM/yyyy HH:mm"]; NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; [df setTimeZone:gmt]; NSDate *myDate = [df dateFromString: dateAsString]; NSLog(@"date: %@", myDate); 

这个问题有很多答案,但我会推荐这个问题:

将GMT NSDate转换为设备当前的时区

 NSString *dateStr = @"2012-07-16 07:33:01"; NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; [dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *date = [dateFormatter1 dateFromString:dateStr]; NSLog(@"date : %@",date); NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone]; // <- Local time zone NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date1]; NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date1]; NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset; NSDate *destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date1] autorelease]; NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init]; [dateFormatters setDateFormat:@"dd-MMM-yyyy hh:mm"]; [dateFormatters setDateStyle:NSDateFormatterShortStyle]; [dateFormatters setTimeStyle:NSDateFormatterShortStyle]; [dateFormatters setDoesRelativeDateFormatting:YES]; [dateFormatters setTimeZone:[NSTimeZone systemTimeZone]]; dateStr = [dateFormatters stringFromDate: destinationDate]; NSLog(@"DateString : %@", dateStr);