time_select and config.time_zone, handling cases when a timezone isn't applicable

I'm running into an issue where I'd like to use timezones in my application, but I'd also like to use times in places where timezone is not applicable. For example, I have a Store model, and I need to track what time of day the store opens. I'm using time_select to edit this field in my form, and when I submit the form with 0 hours, it goes in the db as 05:00:00 (I'm in EST). Then when I refresh the form, it reads this as 05:00:00, and so the displayed number for hours is always 5 more than I entered. Seems to me that the translation to/from utc is only occurring in one direction.

I'm posting this here on the advice of bitsweat from irc. If anybody wants more information or a pastie of sorts, let me know.

HI Liam,

I'd need a bit more info (rails version, config.time_zone setting, store opening time column type, and exactly what you're doing when you "refresh the form") to determine whether this is a framework issue or an application design issue.

Feel free to contact me directly if you like.

Geoff

Hey Geoff, Liam,

I'm running into the same issue, and it's very simple to create an example.

1) $> rails time_select_problem 2) $> cd time_select_problem 3) $> ruby script/generate scaffold stores name:string opens:time 4) Edit config/environment.rb, set config.time_zone = 'Eastern Time (US & Canada)' and config.active_record.default_timezone = :utc 5) $> rake db:create db:migrate 6) $> ruby script/server 7) Navigate to localhost:3000/stores/new 8) Create one, setting the time to 10:00 AM 9) After creation, go to show/edit. You'll see that the time is displayed in both as 3:00 PM. I can understand 'show' failing, as we haven't directly converted to this user's timezone. But edit _should_ show up correctly. If you check the database, you'll see that it was stored as 3:00 PM UTC. The conversion is made from EST to UTC. But when we pull it back out using either time_select or datetime_select, the conversion back is not made.

Does this better illustrate the problem? Is there a flaw in my process? Am I missing something here? It just doesn't seem right that I select 10:00 in the time slot, and then when I edit it with the same form, it shows something else!

-John

Hi John,

We figured out the issue was the combination of time-only columns and multiparameter attributes -- AR::Base#instantiate_time_object is currently doing a time zone conversion for time-only columns, but it shouldn't be.

I'll try to pull in a fix for this in soon (should be simple, we just need to add a check in #instantiate_time_object for the column type), but in the meantime, this will work:

class Store   def self.skip_time_zone_conversion_for_attributes     [:opens]   end end

Geoff

Excellent Geoff! That does the trick (and is cleaner than the massaging I was doing at the controller level in the meantime).

I figured it would be a very straightforward adjustment in rails (the long-term fix, that is).

-John

Excellent Geoff! That does the trick (and is cleaner than the massaging I was doing at the controller level in the meantime).

I figured it would be a very straightforward adjustment in rails (the long-term fix, that is).

Can you guys create a lighthouse ticket for this and assign it to me or geoff, it'd be a shame to ship a release with this bug because this dropped off the radar.

Ticket opened: http://rails.lighthouseapp.com/projects/8994/tickets/1030-multiparameter-attributes-incorrectly-do-time-zone-conversion-on-time-only-columns

I'll pull in a fix for this in the next couple of days. Probably should be merged into 2-1-stable as well.