我有一个城市列表(纽约、伦敦等),我需要进行一些时区转换,但我看到大多数 API 要求您知道时区名称(例如东部标准时间、东京标准时间、 ETC)。
无论如何将城市名称转换为其适当的时区名称?(通过纽约并返回“东部标准时间”)
不知道 C# 中内置的任何类似内容,但您可以为此使用 Google Maps API:
1)获取城市的经纬度:http ://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20CA&sensor=false
2)现在使用那些long/lat来获取时区:https ://maps.googleapis.com/maps/api/timezone/json?location=43.2994285,-74.21793260000001×tamp=1362209227&sensor=false
示例代码:
public TimeZoneResponse ConvertCityToTimeZoneName(string location)
{
TimeZoneResponse response = new TimeZoneResponse();
var plusName = location.Replace(" ", "+");
var address = "http://maps.google.com/maps/api/geocode/json?address=" + plusName + "&sensor=false";
var result = new System.Net.WebClient().DownloadString(address);
var latLongResult = JsonConvert.DeserializeObject<GoogleGeoCodeResponse>(result);
if (latLongResult.status == "OK")
{
var timeZoneRespontimeZoneRequest = "https://maps.googleapis.com/maps/api/timezone/json?location=" + latLongResult.results[0].geometry.location.lat + "," + latLongResult.results[0].geometry.location.lng + "×tamp=1362209227&sensor=false";
var timeZoneResponseString = new System.Net.WebClient().DownloadString(timeZoneRespontimeZoneRequest);
var timeZoneResult = JsonConvert.DeserializeObject<TimeZoneResult>(timeZoneResponseString);
if (timeZoneResult.status == "OK")
{
response.TimeZoneName = timeZoneResult.timeZoneName;
response.Success = true;
return response;
}
}
return response;
}
您可以使用根据知识共享署名 3.0 许可提供的自由时区数据库。您可以在此处找到有关它的信息:
您可以按原样使用 SQL,也可以将 sql 数据库拉入应用程序中的某些类中...
EarthTools.org有一个免费的网络服务,您可以通过 lat/long 查询,例如:
http://www.earthtools.org/timezone/<latitude>/<longitude>
以纽约为例:
http://www.earthtools.org/timezone-1.1/40.71417/-74.00639
但是不,我不知道有任何烘焙类可以做到这一点。
您可以在 .net 框架中获得的最接近的东西是 TimeZonInfo.GetSystemTimeZones()。
请注意,在您的案例中没有一对一的映射,例如,悉尼,澳大利亚一个,加拿大另一个。
使用 C#TimeZoneInfo
你可以做到这一点
TimeZoneInfo.GetSystemTimeZones()
.Where(k=>k.DisplayName.Substring(k.DisplayName.IndexOf(')')+2).ToLower().IndexOf("tokyo") >= 0)
.ToList()
解释:
我使用显示名称来确定每个时区的城市,例如以下格式"(UTC+02:00) Beirut"
。然后取索引")"
+ 2并取下一个不带前导空格的字符串,然后进行查询。
将按城市返回匹配的时区。