58

I have a list of cities, states/provinces, and countries and I need to find their respective timezones easily. Specifically, I need to know which Windows TimeZone they map to. So far this has been a difficult process, because there's no easy way to pass a city to something and get a timezone back (a timezone being an offset and whether or not the timezone supports Daylight Savings Time).

The current flow is to use http://www.batchgeocode.com to get the latitude/longitude of the city (which really calls a Yahoo service) and then call http://www.EarthTools.org to get a timezone letter, which maps to an offset. The problem is the yahoo service will sometimes return a bad longitude/latitude, and earthtools.org doesn't know a lot about DST info so mapping to the correct TimeZone Id is a tedious manual process.

I can't be the first person who has done this- does anybody know of a better way, or some list out there which has the info I need?

Thanks.

Lance Roberts
  • 22,383
  • 32
  • 112
  • 130
mhamrah
  • 9,038
  • 4
  • 24
  • 22

4 Answers4

44

Interesting question! These other three SO posts (41504, 55901 and 237023) mention a couple of leads. There's the Olson database (see the Wikipedia entry for description), but it looks more algorithmic/programmatic (e.g. if you know a county name, there's a rule for it for certain counties in Indiana).

I tried looking at EarthTools but it failed for St.Pierre/Miquelon, one of the good test cases (-3:00 rather the -3:30 for nearby Newfoundland which is what EarthTools says).

Some promising options: worldtimeengine.com has a free interactive version and an API which appears to be inexpensive (5000 queries per British pound), but the API only covers lat,long queries as inputs (not location as input, which is something the interactive version has).

Best lead: I'd look at geonames.org which looks like it has a nice rich API that you could use, and they have both a free (slow) version, and a commercial version for better performance.

p.s. here are some good test cases (from worldtimezone.com and Wikipedia's list of timezones, the map of time zones is also illustrative):

  • Caracas, Venezuela (-4:30)
  • Gander, Newfoundland (-3:30)
  • Tehran, Iran (+3:30)
  • Kabul, Afghanistan (+4:30)
  • Kathmandu, Nepal (+5:45)
  • Yangon, Myanmar (+6:30)
  • Chatham islands, New Zealand (+12:45)
  • Easter Island (-6)
  • St. Pierre and Miquelon (-3)
  • Stanley, Falkland Islands (-4)
  • Evansville, Indiana (-6=Central)
  • Ontario, Oregon (-7=Mountain)
offby1
  • 6,767
  • 30
  • 45
Jason S
  • 184,598
  • 164
  • 608
  • 970
  • 24
    geonames.org provides a data dump (by country) of all known cities and their Olson timezone. Hands down the best way to do it. http://download.geonames.org/export/dump/ – Skylar Sutton Apr 10 '12 at 18:07
  • See also [this community wiki entry](http://stackoverflow.com/q/16086962/634824) – Matt Johnson-Pint Apr 18 '13 at 16:25
  • @skylarsutton seconded. It's pretty simple to load geonames' data into a SQL table and slice it any which way. – Matt Ball Jun 24 '14 at 16:36
2

We use .NET C# MVC and we needed a list of Windows Timezone for Each country.

So that for every registering user we could set the timezone automatically.

Most online databases provide IANA timezones and it's difficult to map to a specific country.

Using NodaTime we managed to create a Json which lists the following entries.

CountryName
2LetterIsoCountryCode
3LetterIsoCountryCode
IANATimezones
WindowsTimezones

You can download the generated JSON here.

Anestis Kivranoglou
  • 7,728
  • 5
  • 44
  • 47
2

moment-timezone is a JavaScript library for timezone calculations.

All their timezone data linking countries, timezomes and offsets is all available in json format.

Tim
  • 7,746
  • 3
  • 49
  • 83
0

I can help with the 2nd part of your current workflow. I've written a Java library which maps lat/long's to timezones, where the database is encoded in the source code.

The source code is basically an enormous tree of if statements: if (lat >= -33.0) if (lng < -151.5) ... else ... and so on. It's just a single class. So if you use C# it would be trivial to port it.

http://www.edval.biz/mapping-lat-lng-s-to-timezones

It's accurate to 22km.

Tim Cooper
  • 10,023
  • 5
  • 61
  • 77
  • 3
    I hope you plan on updating the source code every time a government decides to update time zones. – Matt Ball Jun 19 '14 at 19:22
  • How often does that occur? – Tim Cooper Jun 21 '14 at 14:14
  • 2
    Pretty darn frequently. http://www.timeanddate.com/news/time/ – Matt Ball Jun 21 '14 at 14:41
  • My source code is only affected by (lat,lng) --> TimeZone mapping changes, not DST changes. Since Jan 2012 I see Crimea changing, and a few proposals to change timezones, and a timezone change in Antarctica, but nothing else. But I admit is in an issue. – Tim Cooper Jun 22 '14 at 15:43