【发布时间】:2013-05-13 06:29:28
【问题描述】:
我正在开发一个 iPhone 应用程序,我想在其中找到任何地方的纬度、经度和时区详细信息。
如何一次获取所有这些详细信息。
我们可以很容易地找到纬度和经度,但是我们怎样才能得到那个地方的确切时区呢?
有人可以指导我吗?
谢谢。
【问题讨论】:
标签: iphone ios objective-c
我正在开发一个 iPhone 应用程序,我想在其中找到任何地方的纬度、经度和时区详细信息。
如何一次获取所有这些详细信息。
我们可以很容易地找到纬度和经度,但是我们怎样才能得到那个地方的确切时区呢?
有人可以指导我吗?
谢谢。
【问题讨论】:
标签: iphone ios objective-c
看起来你想要这个:-
NSString *timeZoneName = [[NSTimeZone localTimeZone] name];
这将为我返回 "Asia/Kolkata"。
如果您使用的是systemTimeZone,那么它代表系统(设备)本身使用的时区。
localTimeZone 返回一个代表应用程序当前默认时区的对象。
使用此 API 获取数据并传递 lat 和 long 值。
【讨论】:
您可以使用 CoreLocation 获取经度和纬度。
将此添加到您想要纬度和经度的 .h 类中。
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface CoreLocationViewController : UIViewController <CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}
@property (retain, nonatomic) CLLocationManager *locationManager;
@end
在你的 .m 文件中
#import "CoreLocationViewController.h"
@implementation CoreLocationViewController
@synthesize locationManager;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self setLocationManager:[[CLLocationManager alloc] init]];
[locationManager setDelegate:self];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"My Latitude %f",newLocation.coordinate.latitude);
NSLog(@"My Latitude %f",newLocation.coordinate.longitude);
}
对于当前的时区,您可以使用
NSTimeZone* currentTimeZone = [NSTimeZone systemTimeZone];
NSDateFormatter *dateFormatter = [dateFormat setTimeZone:currentTimeZone];
NSDate *rightNow = [NSDate date];
NSString *dateString = [dateFormatter stringFromDate:rightNow];
【讨论】:
从 CLLocation 获取 NSTimeZone:https://github.com/Alterplay/APTimeZones 此实用程序在没有 3d 派对服务的设备上本地运行。
【讨论】:
您可以使用任何设备获取时区
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
【讨论】:
[destinationTimeZone name]
您可以从 CLLocationManager 获取位置,还可以查看 Geonames.org
这是一项免费的网络服务,可让您从长/纬度获取大量信息
他们还为 GeoNames Webservices 库提供免费(和开源)Java 客户端(还提供了其他语言的库:ruby、python、perl、lisp...)
以下是您可以从 long/lat 获得的一些信息:(complete list of webservices here)
查找最近的地址
找到最近的交点
查找附近的街道
海拔时区
【讨论】:
如果你想知道在这种情况下使用 api,你可以使用这个 api,但在这个 api 中,你首先使用 CLLocationManager 类找到你的纬度和经度,然后输入这个 api。
http://ws.geonames.org/timezone?lat=#{lat}&lng=#{lng}
并阅读谷歌文档以获取更多 api.....
https://developers.google.com/maps/documentation/timezone/
希望对你有帮助
【讨论】:
iOS 5 添加了 CLGeocoder 类,它可以进行您想要的查找。它以异步方式运行(我假设它正在查询某处的服务器),但是您给它一个位置,它会为您提供大量信息,包括时区。这个问题是针对 Objective C 提出的,但我将使用 Swift 来回答。由于 API 相同,Objective C 版本应该很容易派生。
这是在英国寻找地点的 Swift Playground sn-p:
import CoreLocation
let location = CLLocation(latitude: 51, longitude: -0.1)
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
if let error = error {
print(error.localizedDescription)
return
}
if let placemarks = placemarks {
for placemark in placemarks {
print(placemark.name ?? "no name")
print(placemark.locality ?? "no city")
print(placemark.administrativeArea ?? "no state/province")
print(placemark.country ?? "no country")
print(placemark.timeZone?.abbreviation() ?? "no time zone")
}
}
}
这是输出:
1234 A Street Address
Haywards Heath
England
United Kingdom
GMT+1
我故意更改了上面输出中的地址行,以便垃圾邮件机器人不会抓取它并开始征求我任意选择坐标的可怜的灵魂。
【讨论】: