i handle time zones on my site using two fields in my users table: tzadjust and dst. dst is a yes/no field which is whether the user should see times changed for daylight savings time. i use date() if dst is yes, or gmdate() if dst is no -- dreamhost's servers use daylight savings time, but of course gmdate doesn't. tzadjust is a value that can be added directly to timestamp values passed to gmdate or date.
of course users have to specify these settings in order to get something other than server time. i do that by giving them a field showing the current time which they can edit to what they think the current time is, and a daylight savings time checkbox. on the server, i add ' GMT' to the end of the time the user entered if dst is unchecked, convert to a timestamp using strtotime, subtract off time(), then round to the nearest multiple of 1800 (30 minutes).