How to get TimeZone by RemoteIP or for specific city
The goal: to find out the TimeZone of a visitor.
There are few free services that can give you this information.
First step is to get the City name by RemoteIP address – there are free services/databases that helps you to achieve this, one of them is MaxMind.
When you have a city name you can get its latitude/longitude from the database of the same service or you can use Google API like this:
For Berlin, Germany:
https://maps.googleapis.com/maps/api/geocode/json?address=Berlin&sensor=false
You will get JSON result like this:
{
"results" : [
{
"address_components" : [
{
"long_name" : "Berlin",
"short_name" : "Berlin",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Berlin",
"short_name" : "Berlin",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Germany",
"short_name" : "DE",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "Berlin, Germany",
"geometry" :
{
"bounds" :
{
"northeast" :
{
"lat" : 52.6754542,
"lng" : 13.7611176
},
"southwest" :
{
"lat" : 52.33962959999999,
"lng" : 13.0911663
}
},
"location" :
{
"lat" : 52.52000659999999,
"lng" : 13.404954
},
"location_type" : "APPROXIMATE",
"viewport" :
{
"northeast" :
{
"lat" : 52.6754542,
"lng" : 13.7611176
},
"southwest" :
{
"lat" : 52.33962959999999,
"lng" : 13.0911663
}
}
},
"types" : [ "locality", "political" ]
}
],
"status" : "OK"
}
After getting latitude and longitude of the city you can now ask Google for the TimeZone like this
https://maps.googleapis.com/maps/api/timezone/json?location=52.6754542,13.7611176×tamp=1331161200&sensor=false
Note: timestamp is number of seconds since Jan 1st, 1970 which you can calculate in csharp (C#) using these function:
public static double ConvertToUnixTimestamp(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 DateTime ConvertFromUnixTimestamp(double timestamp)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
return origin.AddSeconds(timestamp);
}
And it will return this JSON result with TimeZone offset and name
{
"dstOffset": 0,
"rawOffset": 3600,
"status": "OK",
"timeZoneId": "Europe/Berlin",
"timeZoneName": "Central European Standard Time"
}