在C#中,无论如何都要将城市名称转换为其TimeZone名称(东京 - >东京标准时间)?

时间:2013-03-02 06:15:19

标签: c# datetime timezone

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

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

5 个答案:

答案 0 :(得分: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&timestamp=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;
   }

答案 1 :(得分:2)

您可以使用知识共享署名3.0许可下的免费时区数据库。你可以在这里找到相关的信息:

http://timezonedb.com/

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

答案 2 :(得分:2)

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

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

纽约的例子:

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

但是不,我不知道有任何这样做的上课课程。

答案 3 :(得分:0)

.net框架中最接近的是TimeZonInfo.GetSystemTimeZones()。

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

答案 4 :(得分:0)

使用C#TimeZoneInfo,您可以这样做

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

说明:

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

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