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)