谷歌时区API得到错误的结果

本文关键字:错误 结果 时区 API 谷歌 | 更新日期: 2023-09-27 18:16:52

我试图从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。

当我检查返回数据的时区时,它与所讨论的区域匹配。我还检查了正在传递的UTC时间戳,它是正确的。因此,我不确定我的代码中的错误是什么。

编辑:

这太奇怪了…我的代码运行在。net Fiddle: https://dotnetfiddle.net/lPKJ5Q.

谷歌时区API得到错误的结果

在#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时间,所以我得到了适当的结果,而他们实际上是错误的。