Fun With Time Zones Rails 2.3.8

Hello everyone,

A user enters the time of an event and the time zone of the event. Before validation in the model, I set the zone of the time entered to the one chosen (only changing the zone, not the time)

self.starts_at.zone = time_zone

extending ActiveSupport thus …

module ActiveSupport

class TimeWithZone

def zone=(new_zone = ::Time.zone)

Reinitialize with the new zone and the local time

initialize(nil, ::Time.send(:get_zone, new_zone), time)

end

end

end

and that gets saved nicely in the DB as UTC.

Upon editing that record, I keep getting different time zones being displayed and they change upon page refresh or a new request.

Here is an example of the output after a refresh …

http://i.imgur.com/jbKJC.jpg

Here are the relevant fields after being retrieved in the edit action @event.to_yaml

attributes:

starts_at: 2011-07-08 17:00:00

invitation_expiry: 2011-07-08 16:50:00

time_zone: Pacific Time (US & Canada)

attributes_cache:

starts_at: 2011-07-08 17:00:00 Z

invitation_expiry: 2011-07-08 16:50:00 Z

And here’s some simple debug output from the relevant requests

logger.debug @event.starts_at.zone # → PDT

logger.debug @event.starts_at # → 2011-07-08 10:00:00 -0700

logger.debug @event.starts_at.in_time_zone(@event.time_zone) # → 2011-07-08 10:00:00 -0700

logger.debug @event.starts_at.in_time_zone(‘UTC’) # → 2011-07-08 17:00:00 UTC

logger.debug @event.starts_at.zone # → UTC

logger.debug @event.starts_at # → 2011-07-08 17:00:00 UTC

logger.debug @event.starts_at.in_time_zone(@event.time_zone) # → 2011-07-08 10:00:00 -0700

logger.debug @event.starts_at.in_time_zone(‘UTC’) # → 2011-07-08 17:00:00 UTC

Now, I thought Rails would do all the magic and convert my UTC time (from the DB) in to the time zone that I set. As you can see, it does sometimes but as it’s random, it’s obviously not doing what I thought it would.

This takes me back to my mod_perl days of sometimes it works, sometimes it doesn’t.

Does anyone have any insight in to this, please.

Any pointers would be great. Thanks

-ants