简体   繁体   中英

Rails Time Zone: How to pass time zone configured in application.rb file as parameter to the to_datetime method?

I configured my time zone to indian time zone in my Rails app by adding this line config.time_zone = 'Mumbai' to my application.rb file.

I am having a date time field t.datetime :check_in in my table. To this check_in column I am saving the server time like this Person.check_in = DateTime.now . When I save like this, the time is saving properly, with the time zone configured in the app. after that for some reason when I update like this Person.check_in = "24/08/2015 11:50 AM".to_datetime it is not saving the time with the time zone I configured. Below is my rails console output:

prashant@prashant-pc:~/client_proj/template$ rails c
Loading development environment (Rails 4.1.5)
2.2.2 :001 > check_in =  DateTime.now
 => Mon, 24 Aug 2015 11:41:16 +0530 
2.2.2 :003 > "24/08/2015 11:42  PM".to_datetime
 => Mon, 24 Aug 2015 23:42:00 +0000 
2.2.2 :004 > 

Use in_time_zone from ActiveSupport::TimeWithZone

"2015-08-14 14:38".to_datetime.in_time_zone('Mumbai')
=> Fri, 14 Aug 2015 20:08:00 IST +05:30

"2015-08-14 14:38".to_datetime.in_time_zone('Eastern Time (US & Canada)')
=> Fri, 14 Aug 2015 10:38:00 EDT -04:00

Time.now.in_time_zone("Mumbai")
=> Sat, 22 Aug 2015 12:38:32 IST +05:30
Time.now.in_time_zone("Pacific Time (US & Canada)")
=> Sat, 22 Aug 2015 00:08:21 PDT -07:00

Actually, there are several ways to do the same thing eg using Time.zone.local , Time.zone.parse etc. See the above link for more examples.

To, answer your exact question , to pass the time_zone configured in your application.rb file, you have to use this:

check_in =  DateTime.now
check_in.in_time_zone(Rails.application.config.time_zone).to_datetime

This is unfortunately the designed behavior of to_datetime function.

This other question is what you are after. They provide the following alternatives:

Time.zone.parse('24/08/2015 11:50  AM').to_datetime

or even:

"24/08/2015 11:50  AM".to_datetime.in_time_zone("Mumbai")

Use local time gem. It will display the time in local time zone no matter where you are. It is very good solution as you will don't have to call in time zone method every time you show a date in your views. The Gem has very good documentation as well. Visit https://github.com/basecamp/local_time

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM