If you don't need the user's timezone immediately for their first request (which I assume is why you can't use a javascript solution), using getTimezoneOffset() works pretty well.
Shameless plug: I wrote a gem to handle this in Rails ( https://github.com/zmillman/browser-timezone )
As for guessing timezones - I use GeoIP to get the user's approximate location, then figure out the timezone based on that. It is not perfect, but I needed something that does not require JS.