Skip to content

Instantly share code, notes, and snippets.

@cjolly
Created October 5, 2012 22:19
Show Gist options
  • Save cjolly/3842778 to your computer and use it in GitHub Desktop.
Save cjolly/3842778 to your computer and use it in GitHub Desktop.
DateTime vs Time and ActiveRecord
>> ps.cancel_at
=> Fri, 05 Oct 2012 00:00:00 UTC +00:00
>> ps.cancel_at.class
=> ActiveSupport::TimeWithZone
>> ps.cancel_at = DateTime.new 2012, 11, 05
=> Mon, 05 Nov 2012 00:00:00 +0000
>> ps.save
   (0.2ms)  BEGIN
  Entity Load (0.5ms)  SELECT "entities".* FROM "entities" WHERE "entities"."id" = 2485 LIMIT 1
  Product Load (0.7ms)  SELECT "products".* FROM "products" WHERE "products"."id" = 32445 LIMIT 1
   (0.8ms)  UPDATE "product_subscriptions" SET "cancel_at" = '2012-11-05 00:00:00.000000', "updated_at" = '2012-10-05 22:16:42.029113' WHERE "product_subscriptions"."id" = 6762
   (1245.9ms)  COMMIT
=> true
>> ps.cancel_at = Time.local 2012, 11, 05
=> 2012-11-05 00:00:00 -0700
>> ps.save
   (0.2ms)  BEGIN
   (0.5ms)  UPDATE "product_subscriptions" SET "cancel_at" = '2012-11-05 07:00:00.000000', "updated_at" = '2012-10-05 22:17:32.097390' WHERE "product_subscriptions"."id" = 6762
   (0.4ms)  COMMIT
=> true
>> 
@cjolly
Copy link
Author

cjolly commented Oct 5, 2012

Dates with time zone are good for when things happened, but not necessarily for scheduling, such as a due date.

Consider setting something due for Oct 5th mountain time, beginning of day. That task will appear due for your colleague in Pacific time on the 4th, which is super confusing unless you display the time along with it.

@nzifnab
Copy link

nzifnab commented Oct 5, 2012

It's not necessarily that a due date is bad for dates with time zone. Maybe something needs to be finished by end of work day... you'd set the timestamp to `2012-10-05 6:00 PM MDT' and i would make sense for you and any others looking since it's due by that exact time.

The issue comes up when you have a date but are storing it as a datetime. Your nice "October 5th" date gets a silent "at midnight" appended to it, which messes with your coordination between time zones. If you don't intend to use a value as a DateTime then the database should store it as a Date

... Assuming Date objects in the database don't come with timezone support.

@cjolly
Copy link
Author

cjolly commented Oct 11, 2012

Something we could consider is our nice_date helper, perhaps adding a precise_date which normalizes to a set TZ regardless of logged_in user's TZ.

>> Time.utc(2012, 8, 13, 5, 0).in_time_zone(-6.hours).to_date
=> Sun, 12 Aug 2012
>> Time.utc(2012, 8, 13, 5, 0).to_date
=> Mon, 13 Aug 2012
>> 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment