我正在尝试根据Google TimeZone API的纬度和经度获取当地时间。我使用RestSharp获取数据。这是我的代码:
public class GoogleTimeZone
{
public double dstOffset { get; set; }
public double rawOffset { get; set; }
public string status { get; set; }
public string timeZoneId { get; set; }
public string timeZoneName { get; set; }
}
public static DateTime GetLocalDateTime(double latitude, double longitude, DateTime date)
{
var client = new RestClient("https://maps.googleapis.com");
var request = new RestRequest("maps/api/timezone/json", Method.GET);
request.AddParameter("location", latitude + "," + longitude);
request.AddParameter("timestamp", date.ToTimestamp());
var response = client.Execute<GoogleTimeZone>(request);
return date.AddSeconds(response.Data.rawOffset + response.Data.dstOffset);
}
public static class DateTimeExtentionMethods
{
public static double ToTimestamp(this DateTime date)
{
return date.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
}
}
当我运行以下代码时:
// Algeria
var myDateTime = GetLocalDateTime(29.204918, 1.845703, DateTime.Now);
Console.WriteLine(myDateTime.ToString());
// California
myDateTime = GetLocalDateTime(34.020084, -118.182678, DateTime.Now);
Console.WriteLine(myDateTime.ToString());
...我得到了以下输出:
8/5/2014 6:18:22 PM
8/5/2014 10:18:22 AM
第一个是阿尔及利亚,第二个是加利福尼亚。然而,这是关闭的。阿尔及利亚的时间应该是8月6日上午1:18:22,加利福尼亚的当前时间应该是8月5日下午5:18:22。
当我检查返回数据的时区时,它与相关区域匹配。我也checked the UTC timestamp正在通过并且它是正确的。因此,我不确定我的代码中的错误是什么。
修改
这非常奇怪......我的代码按照.NET Fiddle的预期运行:https://dotnetfiddle.net/lPKJ5Q。
答案 0 :(得分:3)
通过#csharp @ freedone.net(尤其是Suchiman)上的一些人来弄清楚出了什么问题。在GetLocalDateTime
方法中,此行是导致所有问题的行:
return date.AddSeconds(response.Data.rawOffset + response.Data.dstOffset);
它将原始和夏令时偏移添加到当地时间,而不是UTC时间。
这是新代码:
public static DateTime GetLocalDateTime(double latitude, double longitude, DateTime date)
{
date = date.ToUniversalTime(); // Convert to UTC
var client = new RestClient("https://maps.googleapis.com");
var request = new RestRequest("maps/api/timezone/json", Method.GET);
request.AddParameter("location", latitude + "," + longitude);
request.AddParameter("timestamp", date.ToTimestamp());
request.AddParameter("sensor", "false");
var response = client.Execute<GoogleTimeZone>(request);
return date.AddSeconds(response.Data.rawOffset + response.Data.dstOffset);
}
...当然,我们可以在ToTimeStamp
扩展方法中摆脱UTC转换。
至于为什么它在.NET Fiddle上工作......可能是因为因为他们的服务器正在发出请求,所以可能是在UTC时间,所以我得到了合适的结果,虽然他们实际上是错误的。