public static void Main()
var myDateTime = GetLocalDateTime(-37.9716929,144.7729587, DateTime.UtcNow);
ShowTimeZone(myDateTime.TimeZone);
Console.WriteLine("Current Local time: {0:ddd d-MMM-yyyy h:mm:ss tt} (UTC {1})", myDateTime.LocalTime, myDateTime.Offset.AsHours());
public static TimeZoneWithDateTime GetLocalDateTime(double latitude, double longitude, DateTime utcDate)
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", utcDate.ToTimestamp());
ShowFullUrl(client, request);
var response = client.Execute<GoogleTimeZone>(request);
return new TimeZoneWithDateTime(response.Data, utcDate);
public static void ShowFullUrl(RestClient client, RestRequest request)
var fullUrl = client.BuildUri(request);
Console.WriteLine("URL: {0}", fullUrl);
public static void ShowTimeZone(GoogleTimeZone data)
var offset = TimeSpan.FromSeconds(data.rawOffset + data.dstOffset);
Console.WriteLine("TimeZone: {0}, {1}, {2}", data.timeZoneId, data.timeZoneName, offset.AsHours());
public class TimeZoneWithDateTime
public TimeZoneWithDateTime( GoogleTimeZone timeZone, DateTime utcTime)
public readonly GoogleTimeZone TimeZone;
public readonly DateTime UtcTime;
return TimeSpan.FromSeconds(TimeZone.rawOffset + TimeZone.dstOffset);
public DateTimeOffset LocalTime
var localDateTime = DateTime.SpecifyKind(UtcTime.AddSeconds(Offset.TotalSeconds), DateTimeKind.Unspecified);
return new DateTimeOffset(localDateTime.Ticks, Offset);
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 class ExtensionMethods
public static double ToTimestamp(this DateTime date)
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan diff = date.ToUniversalTime() - origin;
return Math.Floor(diff.TotalSeconds);
public static string AsHours(this TimeSpan offset)
if (offset > TimeSpan.Zero)
adj += string.Format("{0}:{1:00} hours", offset.Hours, offset.Minutes);