Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails timezone differences between Time and DateTime

I have the timezone set.

config.time_zone = 'Mountain Time (US & Canada)'

Creating a Christmas event from the console...

c = Event.new(:title => "Christmas") 

using Time:

c.start = Time.new(2012,12,25)  
=> 2012-12-25 00:00:00 -0700 #has correct offset  
c.end = Time.new(2012,12,25).end_of_day  
=> 2012-12-25 23:59:59 -0700 #same deal  

using DateTime:

c.start = DateTime.new(2012,12,25)  
=> Tue, 25 Dec 2012 00:00:00 +0000 # no offset  
c.end = DateTime.new(2012,12,25).end_of_day  
=> Tue, 25 Dec 2012 23:59:59 +0000 # same  

I've carelessly been using DateTime thinking that input was assumed to be in the config.time_zone but there's no conversion when this gets saved to the db. It's stored just the same as the return values (formatted for the db).

Using Time is really no big deal but do I need to manually offset anytime I'm using DateTime and want it to be in the correct zone?

like image 319
kjs3 Avatar asked Aug 11 '26 23:08

kjs3


1 Answers

Yep. Time.new will intepret parameters as local time in the absence of a specific timezone, and DateTime.new will intepret parameters as UTC in the absence of a specific timezone. As documented. You may want to replace Time.new with Time.local for clarity throughout your code.

What you can do is use DateTime's mixins for Time to invoke Time.local(2012,12,25).to_datetime. But if the year/month/day is coming from a user/browser, then perhaps you should get the user's/browser's timezone instead of using your server's.

If you need to create a migration to fix existing data in the DB, new_date_time = Time.local(old_date_time.year, old_date_time.mon, old_date_time.mday, old_date_time.hour, old_date_time.min, old_date_time.sec).to_datetime

like image 138
vladr Avatar answered Aug 14 '26 15:08

vladr



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!