#6. Fetch time in rails

 In the Rails do not prefer to use Time.now, Date.today etc
We should always prefer to use it with zone like, Time.zone.now, Time.zone.today etc. but why so?

Beacause when we fetch Time.now its always return system local time and ignore config.time_zone set in the application.rb.file. Here is the example tested in the rails console,

3.0.3 :001 > Time.now

 => 2022-04-19 09:57:58.413034249 +0530 

3.0.3 :002 > Time.zone

 => #<ActiveSupport::TimeZone:0x000055704feec360 @name="UTC", @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @utc_offset=nil> 

3.0.3 :003 > Time.zone.now

 => Tue, 19 Apr 2022 04:28:07.277000358 UTC +00:00 

3.0.3 :004 > Time.zone = 'Sydney'

 => "Sydney" 

3.0.3 :005 > Time.zone

 => #<ActiveSupport::TimeZone:0x000055705192d850 @name="Sydney", @tzinfo=#<TZInfo::DataTimezone: Australia/Sydney>, @utc_offset=nil> 

3.0.3 :008 > Time.now

 => 2022-04-19 09:58:48.79600594 +0530 

3.0.3 :009 > Time.zone.now

 => Tue, 19 Apr 2022 14:28:53.212277352 AEST +10:00 

3.0.3 :011 > Date.today
 => Tue, 19 Apr 2022 

3.0.3 :013 > Time.zone.today
 => Tue, 19 Apr 2022 

3.0.3 :001 > Time.zone = 'Pacific/Honolulu'
 => "Pacific/Honolulu" 
3.0.3 :002 > Time.now
 => 2022-04-29 14:07:16.545158529 +0530 
3.0.3 :003 > Time.zone.now
 => Thu, 28 Apr 2022 22:37:23.106048830 HST -10:00 
3.0.3 :004 > Date.today
 => Fri, 29 Apr 2022 
3.0.3 :005 > Time.zone.today
 => Thu, 28 Apr 2022 
3.0.3 :006 > Date.current
 => Thu, 28 Apr 2022 

3.0.3 :004 > Time.now
 => 2022-05-23 09:47:57.242670312 +0530 
3.0.3 :005 > Time.zone
 => #<ActiveSupport::TimeZone:0x0000559d69a7c0e0 @name="UTC", @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @utc_offset=nil> 
3.0.3 :006 > Time.zone = 'Pacific/Honolulu'
 => "Pacific/Honolulu" 
3.0.3 :007 > Time.zone
 => #<ActiveSupport::TimeZone:0x0000559d6974b6f0 @name="Pacific/Honolulu", @tzinfo=#<TZInfo::DataTimezone: Pacific/Honolulu>, @utc_offset=nil> 
3.0.3 :008 > Time.now
 => 2022-05-23 09:49:27.289810693 +0530 
3.0.3 :009 > Time.zone.now
 => Sun, 22 May 2022 18:19:37.707613755 HST -10:00 
3.0.3 :010 > Time.now.localtime
 => 2022-05-23 09:49:42.857303049 +0530 

Another example

Time.zone

Time.now

Time.now.localtime

Time.zone.now

Time.zone.today

Time.current

Date.today

Date.today.to_time

Time.parse("2022-07-06 09:59:07")

Time.strptime("2022-07-06T09:59:07+0530", "%Y-%m-%dT%H:%M:%S%z")

2.hours.ago

Date.current

1.day.from_now


Time.zone = 'Pacific/Honolulu'


Time.zone

Time.now

Time.now.localtime

Time.zone.now

Time.zone.today

Time.current

Date.today

Date.today.to_time

Time.parse("2022-07-06 09:59:07")

Time.strptime("2022-07-06T09:59:07+0530", "%Y-%m-%dT%H:%M:%S%z")

2.hours.ago

Date.current

1.day.from_now

===============================================================

DON’T USE
* Time.now
* Date.today
* Date.today.to_time
* Time.parse("2015-07-04 17:05:37")
* Time.strptime(string, "%Y-%m-%dT%H:%M:%S%z")

DO USE
* Time.current
* 2.hours.ago
* Time.zone.today
* Date.current
* 1.day.from_now

Reference - 
1. https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
2. https://en.wikipedia.org/wiki/List_of_time_zones_by_country
3. https://thoughtbot.com/blog/its-about-time-zones

Comments

Popular posts from this blog

#8. nginx+puma deployment using capistrano

#21. Rails scope