Hello and thanks for taking the time to read this,
last night I came across two problems from which the first one - I am
sure - is easy to solve. But as I am a beginner I am unable to find the
solution.
As I learned through the night rails stores created_at dates in utc.
Sure enough my local time zone is not utc
When I have an item and use the method created_at rails translates the
time to my local time zone.
So when I add an item at 0:15 am local time and want to list all the
items for today with
this item will never be found as its created_at date is yesterday. My
first idea was to add 7200 two created_at in the find clause, but that
would be an ugly workaround (I even did not get that to workâŚ).
Can You tell me what would be the correct solution to translate?
And now the second question: Is there (already) a best practice to query
this in rails 3? I didnât find a solution to do a âLIKEâ query without a
plugin, so how can one get all items created today out of the database?
@orders = Order.where(:created_at.to_date => Time.now.to_date) does not
work as I cannot add the method to_date to a symbol.
Can You tell me what would be the correct solution to translate?
You can get the current UTC time using:
Time.now.utc
And now the second question: Is there (already) a best practice to query
this in rails 3? I didnât find a solution to do a âLIKEâ query without a
plugin, so how can one get all items created today out of the database?
@orders = Order.where(:created_at.to_date => Time.now.to_date) does not
work as I cannot add the method to_date to a symbol.
Yeah, youâre right, using LIKE for this isnât great. If youâre looking
for times that occur during today (local time) then what youâre really
looking for is times that occur between midnight today and midnight
tomorrow. So I would probably do conditions like:
midnight = Time.now.midnight.utc # find last midnight in local time,
then convert to UTC
Iâd also recommend the TZInfo library (http://tzinfo.rubyforge.org/)
if youâre going to need to do reporting of this sort for clients in
more than one timezone.
In addition to Chrisâ recommendations, you should check out the Rails
ActiveSupport::CoreExtensions helpers like .beginning_of_day and
.end_of_day methods which, IMHO, are more readable than using
:advance.
Itâs also possible to improve readability using more Ruby like idioms:
SELECT * FROM âitemsâ WHERE (âitemsâ.âcreated_atâ >= â2010-09-02â AND
'items".âcreated_atâ < â2010-09-03â)
But going back to the OPâs original point, that will give all items
created on that day UTC whereas I think he wanted items created today
local time.
SELECT * FROM âitemsâ WHERE (âitemsâ.âcreated_atâ >= â2010-09-02â AND
'items".âcreated_atâ < â2010-09-03â)
But going back to the OPâs original point, that will give all items
created on that day UTC whereas I think he wanted items created today
local time.
Colin
Thatâs it. Normally nobody will use this app in the night, but I am
sure, if I leave this âholeâ of two hours someone will test it at 1:00
am
So thanks again to everybody for your input!
Sven
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.