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

时间:2013-08-07 15:43:25

标签: iphone ios objective-c parse-platform

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

enter image description here

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

6 个答案:

答案 0 :(得分:54)

NSDate始终以GMT表示。这就是你如何代表它可能会改变的。

如果您要将日期打印到label.text,请使用NSDateFormatter[NSTimeZone localTimeZone]将其转换为字符串,如下所示:

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

答案 1 :(得分:25)

我发现的最简单方法是:

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

答案 2 :(得分:5)

这是将NSDate更改为本地时区日期的非常简洁的方法

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/

答案 3 :(得分:3)

创建如下的Xcode测试用例可以帮助我们记住规则"永远":

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

答案 4 :(得分:2)

您可以使用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);

答案 5 :(得分:1)

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

Convert GMT NSDate to device's current Time Zone

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