C# 谷歌时区API获得错误结果

C# 谷歌时区API获得错误结果,c#,datetime,google-api,google-api-timezone,C#,Datetime,Google Api,Google Api Timezone,我正在尝试从中获取基于纬度和经度的本地时间。我正在使用以获取我的数据。这是我的密码: public class GoogleTimeZone { public double dstOffset { get; set; } public double rawOffset { get; set; } public string status { get; set; } public string timeZoneId { get; set; } public

我正在尝试从中获取基于纬度和经度的本地时间。我正在使用以获取我的数据。这是我的密码:

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;
    }
}
…我得到了以下输出:

8/5/2014 6:18:22 PM
8/5/2014 10:18:22 AM
第一个是阿尔及利亚,第二个是加利福尼亚。然而,这是远远不够的。阿尔及利亚的时间应该是8月6日凌晨1:18:22,加利福尼亚的时间应该是8月5日下午5:18:22

当我检查返回数据的时区时,它与所讨论的区域相匹配。我也认为这是通过的,这是正确的。因此,我不确定代码中的错误是什么

编辑:


这太奇怪了。。。我的代码在.NET Fiddle上按预期运行:。

多亏了#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);
}
publicstaticdatetime GetLocalDateTime(双纬度、双经度、DateTime日期)
{
date=date.ToUniversalTime();//转换为UTC
var client=新的RestClient(“https://maps.googleapis.com");
var request=new RestRequest(“maps/api/timezone/json”,Method.GET);
AddParameter(“位置”、“纬度+”、“+经度”);
request.AddParameter(“timestamp”,date.ToTimestamp());
请求。添加参数(“传感器”、“假”);
var response=client.Execute(请求);
返回日期.AddSeconds(response.Data.rawOffset+response.Data.dstOffset);
}
…当然,我们可以在
ToTimeStamp
扩展方法中取消UTC转换

至于它为什么在.NETFiddle上起作用。。。这可能是因为他们的服务器发出请求,可能是在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);
}