如何获取CLLocation的时区名称

时间:2013-03-14 18:19:21

标签: dst clgeocoder nstimezone

我有一个应用程序,它使用CLGeocoder从地址字符串转发地理编码地标。 CLPlacemark响应包含一个CLLocation,它给我GPS坐标。

创建NSTimeZone的唯一方法似乎是使用正确的时区名称。重要的是要指出我没有使用设备的当前位置,因此[NSTimeZone localTimeZone]对我不起作用。

有没有办法获取CLLocation的时区名称,以便我可以正确创建NSTimeZone?

注意:我一直在使用timeZoneForSecondsFromGMT但从不包含正确的DST数据,因此对我没用。

4 个答案:

答案 0 :(得分:4)

您应该使用https://github.com/Alterplay/APTimeZones从CLLocation获取NSTimeZone。它也适用于CLGeocoder。

答案 1 :(得分:1)

因为iOS9应该可以使用此处指定的CLGeocoder直接:https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html

  

MapKit和CLGeocoder的搜索结果可以为结果提供时区。

答案 2 :(得分:0)

我使用CLGeocoder找到了interesting approach,我将其放入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
    }
}];

尽管需要网络连接并且异步工作,但我发现这是获取某个位置时区的最可靠方法。

答案 3 :(得分:0)

我从CLLocation获得了时区名称的正确解决方案,但它适用于ios8及更高版本。 Click on the link for see the answer of the same question like this for getting time zone.