Convert GMT NSDate to device's current Time Zone

前端 未结 6 1332
小蘑菇
小蘑菇 2020-12-08 05:30

I\'m using Parse.com to store some values:

\"enter

These are GMT values. How d

相关标签:
6条回答
  • 2020-12-08 06:03

    Creating an Xcode test case like the following may help us remember the rules "forever":

    - (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);
    }
    
    0 讨论(0)
  • 2020-12-08 06:07

    The easiest method I've found is this:

    NSDate *someDateInUTC = …;
    NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];
    
    0 讨论(0)
  • 2020-12-08 06:08

    You could use a NSDateFormatter to achieve this result.

    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);
    
    0 讨论(0)
  • 2020-12-08 06:24

    NSDate is always represented in GMT. It's just how you represent it that may change.

    If you want to print the date to label.text, then convert it to a string using NSDateFormatter and [NSTimeZone localTimeZone], as follows:

    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
    
    0 讨论(0)
  • 2020-12-08 06:26

    This is a very clean way to change the NSDate to a local time zone 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
        }
    }
    

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

    0 讨论(0)
  • 2020-12-08 06:28

    There are many answers to this question but I would recommend this one:

    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);
    
    0 讨论(0)
提交回复
热议问题