2013-03-14 6 views
2

У меня есть приложение, которое использует CLGeocoder для пересылкиGeocode метки из адресной строки. Ответ CLPlacemark содержит CLLocation, который дает мне GPS-координаты.Как получить имя часового пояса для CLLocation

Единственный способ создать NSTimeZone, похоже, с использованием правильного имени часового пояса. Важно отметить, что я не использую текущее местоположение устройства, поэтому [NSTimeZone localTimeZone] не будет работать для меня.

Есть ли способ получить имя часового пояса для CLLocation, чтобы я мог правильно создать NSTimeZone?

ПРИМЕЧАНИЕ. Я использую timeZoneForSecondsFromGMT, но никогда не содержит правильных данных DST, поэтому мне это не помогает.

+0

возможно дубликат [временная зона поиска от широты долготы] (http://stackoverflow.com/questions/41504/timezone-lookup-from-latitude-longitude) –

+0

Неужели нет способа сделать это без пинговать сервер ? – Joshua

ответ

3

Вы должны использовать https://github.com/Alterplay/APTimeZones, чтобы получить NSTimeZone из CLLocation. Он также работает с CLGeocoder.

+2

APTimeZones продемонстрировали много обещаний, но, к сожалению, у него есть проблемы с дизайном, которые могут привести к неправильным результатам. Вы можете [прочитать об этом здесь] (https://github.com/Alterplay/APTimeZones/issues/2). – chris

0

Я нашел interesting approach с использованием CLGeocoder, который я ввел в категорию на CLLocation. Интересная часть выглядит следующим образом:

-(void)timeZoneWithBlock:(void (^)(NSTimeZone *timezone))block {   
    [[[CLGeocoder alloc] init] reverseGeocodeLocation:self completionHandler:^(NSArray *placemarks, NSError *error) {   
     NSTimeZone *timezone = nil; 

     if (error == nil && [placemarks count] > 0) {    
      CLPlacemark *placeMark = [placemarks firstObject]; 
      NSString *desc = [placeMark description]; 

      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"identifier = \"([a-z]*\\/[a-z]*_*[a-z]*)\"" options:NSRegularExpressionCaseInsensitive error:nil]; 
      NSTextCheckingResult *result = [regex firstMatchInString:desc options:0 range:NSMakeRange(0, [desc length])]; 

      NSString *timezoneString = [desc substringWithRange:[result rangeAtIndex:1]]; 

      timezone = [NSTimeZone timeZoneWithName:timezoneString]; 
     } 
     block(timezone);    
    }]; 
} 

Использование как это:

CLLocation *myLocation = ... 
[myLocation timeZoneWithBlock:^(NSTimeZone *timezone) { 
    if (timezone != nil) { 
     // do something with timezone 
    } else { 
     // error determining timezone 
    } 
}]; 

Несмотря требует подключения к сети и работает асинхронно, я обнаружил, что это самый надежный способ получения часового пояса для местоположения.

Смежные вопросы