I searched for a long time to find a database I could host locally to map lat+lon coordinates to a timezone (i.e. no dependency on a remote service). This is the best I was able to come up with.
A vectorized timezone map is available here: http://georezo.net/jparis/Data/wrldtz_tab.htm . This is a database of almost 2000 "regions". Each region is defined by a set of polygons on the surface of the Earth, and it tells you what timezone you are in if you are inside that region.
There are major drawbacks:
- It hasn't been updated since 2002.
- It only defines polygons over land (if you are over water, you are not considered to be in any time zone).
- It does not give you the Olson identifiers for the timezones, only the name of the country and the (standard time) UTC offset.
The last limitation might not be a big problem for you: there are not that many timezones and maybe you are able to invest the time to manually assign each one to its Olson name (especially if you are interested in only a small number of timezones).
In order to read the data files which you can download from the web site given above, you will need to use this library. I would be able to come up with some sample code if you are interested.
You also mention using a physical (postal) address. Translating those to lat+lon coordinates is a whole separate question, and my guess is that you can't do a good job of that without using some kind of online/remote service.
-Phil