A simple question, a big answer:
There are few companies that are able to do that. The iphone was the first device that I know that could determine the timeZone from geo position. Even my TomTom Navi cannot do that and I have to manually enter the TimeZone offset.
Here how you would do that.
Buy for some xxx euro navteq "WorldMaps", or go cheaper using OpenStreetMap.
Some conversion later you will have the polygons for each country of the world.
Such country will typically have 50.000 points or more representing the country border.
Once you have that polygons you have to write a function that gives the countryPolygonId (or countryID) for given (lat/lon).
(countryId = findCountry(lat, lon); // using a point in polygon method
Once you have the country, you must find the next big city:
You need to have a list of cities that are supported by the TimeZone module of your system (I think there is a norm for that, but I am not sure.)
Then you have to translate countryId, cityId to a String like "Austria/Vienna".
This is your TimeZone and you cann initialize with TimeZone zt = new TimeZone("Austria/Vienna");
I hope this was interesting, but this is very demanding to implement, and to get the neccessary data for that task.
I have done steps 1, and 2 for a different use case.