iPhone: конвертировать GMT в местное время

Когда я конвертирую время из своего симулятора Xcode для iPhone, мой код работает нормально, и вывод показан здесь:

2014-02-12 18:11:52 +0000

Местный часовой пояс (Европа/Лондон (GMT), смещение 0)

0

но когда я пытаюсь использовать свое приложение на своем iPhone 5, вывод изменился на

1970-01-01 12:00:00 am +0000

Местный часовой пояс (Европа/Лондон (GMT), смещение 0)

0

я использую xcode 5.0 и iOS 7

-(NSDate *)convertGMTtoLocal:(NSString *)gmtDateStr {

    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSTimeZone *gmt = [NSTimeZone systemTimeZone];

    [formatter setTimeZone:gmt];

    NSDate *GMTTime = [formatter dateFromString:gmtDateStr];

    NSTimeZone *tz = [NSTimeZone localTimeZone];
    NSLog(@"%@",tz);
    NSInteger seconds = [tz secondsFromGMTForDate: GMTTime];
    NSLog(@"%ld",(long)seconds);
    NSLog(@"%@",[NSDate dateWithTimeInterval: seconds sinceDate: GMTTime]);
    return [NSDate dateWithTimeInterval: seconds sinceDate: GMTTime];

}

Спасибо,


person user3116050    schedule 12.02.2014    source источник
comment
stackoverflow.com/questions/6613110/   -  person Hot Licks    schedule 12.02.2014
comment
Спасибо проблема решена :)   -  person user3116050    schedule 12.02.2014


Ответы (2)


NSLog регистрирует даты по Гринвичу. Не используйте это. Создайте средство форматирования даты и используйте его для регистрации даты. Код другого плаката точно в обратном порядке и преобразует дату в GMT. Оставьте вызов setTimeZone в коде vborra, и он должен указать дату по местному времени.

Код может выглядеть так:

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  [dateFormatter setDateStyle:NSDateFormatterNoStyle];
  [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
  NSString *time = [dateFormatter stringFromDate:[NSDate date]];
  NSLog(@"Time is %@", time);
person Duncan C    schedule 12.02.2014
comment
Но проблема ОП в том, что он не установил локаль. - person Hot Licks; 13.02.2014
comment
Нет, проблема ОП в том, что он напрямую зарегистрировал NSDate. Это вызывает метод описания NSDate, который отображает дату по Гринвичу. Средство форматирования даты по умолчанию будет использовать текущую локаль пользователя. Если вам нужна другая локаль (либо для другого часового пояса, либо для другого формата времени), вы МОЖЕТЕ изменить ее, но, скорее всего, локаль по умолчанию будет правильной. - person Duncan C; 13.02.2014
comment
Посмотрите, что он записал — на одном видно AM, а на другом нет. Явный признак классической локализации. Пройдите по ссылке, если не верите. - person Hot Licks; 13.02.2014
comment
Hot Licks решают мою проблему, спасибо, ребята, с форматом все в порядке, идея моего приложения заключается в том, чтобы получать время с сервера и преобразовывать его в местное время. теперь все работает нормально. проблема с AM и PM - person user3116050; 13.02.2014

Пусть это расширение будет проще.

Swift 4: UTC/GMT ⟺ Локальный (текущий/системный)

extension Date {

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

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

}


// Try it
let utcDate = Date().toGlobalTime()
let localDate = utcDate.toLocalTime()

print("utcDate - (utcDate)")
print("localDate - (localDate)")
person Krunal    schedule 22.02.2018