3

我有一个城市列表(纽约、伦敦等),我需要进行一些时区转换,但我看到大多数 API 要求您知道时区名称(例如东部标准时间、东京标准时间、 ETC)。

无论如何将城市名称转换为其适当的时区名称?(通过纽约并返回“东部标准时间”)

4

5 回答 5

6

不知道 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 + "&timestamp=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;
   }
于 2013-03-02T06:28:06.873 回答
2

您可以使用根据知识共享署名 3.0 许可提供的自由时区数据库。您可以在此处找到有关它的信息:

http://timezonedb.com/

您可以按原样使用 SQL,也可以将 sql 数据库拉入应用程序中的某些类中...

于 2013-03-02T06:22:10.930 回答
2

EarthTools.org有一个免费的网络服务,您可以通过 lat/long 查询,例如:

http://www.earthtools.org/timezone/<latitude>/<longitude>

以纽约为例:

http://www.earthtools.org/timezone-1.1/40.71417/-74.00639

但是不,我不知道有任何烘焙类可以做到这一点。

于 2013-03-02T06:22:18.320 回答
0

您可以在 .net 框架中获得的最接近的东西是 TimeZonInfo.GetSystemTimeZones()。

请注意,在您的案例中没有一对一的映射,例如,悉尼,澳大利亚一个,加拿大另一个。

于 2013-03-02T06:36:11.527 回答
0

使用 C#TimeZoneInfo你可以做到这一点

TimeZoneInfo.GetSystemTimeZones()
            .Where(k=>k.DisplayName.Substring(k.DisplayName.IndexOf(')')+2).ToLower().IndexOf("tokyo") >= 0)
            .ToList()

解释:

我使用显示名称来确定每个时区的城市,例如以下格式"(UTC+02:00) Beirut"。然后取索引")"+ 2并取下一个不带前导空格的字符串,然后进行查询。

将按城市返回匹配的时区。

于 2019-06-08T17:01:45.163 回答