Value of timezone gets added in the selected time (Ruby on Rails) - ruby-on-rails

I'm using current user time to show time. But the timezone of user gets added in the time selected. Let's say, if user's timezone is +05:30 Asia/Kolkata ,then the value 05:30 gets added in the selected time. This is the code I'm using.
def customer_timezone
user_profile_timezone = current_user.user_profile.timezone_name
if user_profile_timezone.present?
time_zone = ActiveSupport::TimeZone[user_profile_timezone]
#user_timezone = "#{time_zone.formatted_offset} - #{time_zone.name}" if time_zone.present?
end
return #user_timezone
end
Is there any way possible to resolve this issue?

Related

Ruby - Is there a way to get the timestamp for a specific future time but have that be dependent on timezone

I have an email system. I want to send emails to people at 8AM local time. If I have their timezone in this format: "America/New_York" how can I get a Time object with the next instance of 8AM for that timezone?
I assume that you have a User model and each user has its timezone stored in an attribute timezone and timezone #=> 'America/New_York'.
Then you can add a method like the following to your User model:
def next_time_it_is_8am_in_this_users_timezone_in_utc
time = ActiveSupport::TimeZone[timezone].now.change(hour: 8)
time = time + 1.day if time.past?
time.utc
end

How to present Rails form datetime select in different time zone?

I would like to present a datetime select to the user in their preferred time zone but store the datetime as UTC. Currently, the default behavior is to display and store the datetime field using UTC. How can I change the behavior of this field without affecting the entire application (i.e. not changing the application default time zone)?
Update: This is not a per-user timezone. I don't need to adjust how times are displayed. Only these specific fields deal with a different time zone, so I would like the user to be able to specify the time in this time zone.
Here's how you can allow the user to set a date using a specific time zone:
To convert the multi-parameter attributes that are submitted in the form to a specific time zone, add a method in your controller to manually convert the params into a datetime object. I chose to add this to the controller because I did not want to affect the model behavior. You should still be able to set a date on the model and assume your date was set correctly.
def create
convert_datetimes_to_pdt("start_date")
convert_datetimes_to_pdt("end_date")
#model = MyModel.new(params[:my_model])
# ...
end
def update
convert_datetimes_to_pdt("start_date")
convert_datetimes_to_pdt("end_date")
# ...
end
def convert_datetimes_to_pdt(field)
datetime = (1..5).collect {|num| params['my_model'].delete "#{field}(#{num}i)" }
if datetime[0] and datetime[1] and datetime[2] # only if a date has been set
params['my_model'][field] = Time.find_zone!("Pacific Time (US & Canada)").local(*datetime.map(&:to_i))
end
end
Now the datetime will be adjusted to the correct time zone. However, when the user goes to edit the time, the form fields will still display the time in UTC. To fix this, we can wrap the fields in a call to Time.use_zone:
Time.use_zone("Pacific Time (US & Canada)") do
f.datetime_select :start_date
end
There are a couple of options:
Utilize the user's local timezone when displaying data to them. This is really easy with something like the browser-timezone-rails gem. See https://github.com/kbaum/browser-timezone-rails. It is essentially overriding the application timezone for each request based on the timezone detected from the browser. NOTE: it only uses the OS timezone, so it's not as accurate as an IP/geo based solution.
Setup your application timezone so that it is consistent with the majority of your user base. For example: config.time_zone = 'Mountain Time (US & Canada)'. This is a very standard thing to do in rails. Rails will always store the data in the DB as UTC, but will present / load it using the application timezone.
Create a timezone for your user model. Allow users to set this value in their account settings. And, then use a similar approach to that of the above gem does in the application_controller.

How to change Rails app time zone setting based on user's input?

I have a User model, which allow user to provide their own time zone. User can choose their own time zone using the time_zone_select. So we will store something like Pacific Time (US & Canada) in database.
My Rails 3 application default setting is using Pacific Time (US & Canada). So all the time display is in this time zone.
May I change the time time display based on user time zone? For example, User A will see all the time displayed in his time zone Central Time (US & Canada), and User B will see all the time in London.
Thanks all.
In controllers/application.rb
before_filter :set_user_time_zone
private
def set_user_time_zone
Time.zone = current_user.time_zone if logged_in?
end
From railscast
First you'll need to add a column to your users table, to keep the selected timezone for this user (user.timezone should be fine).
in the form, you'll need to use ActiveSupport's #time_zone_select to allow the user to select their desired timezone.
finally, you'll need a before filter in ApplicationController to set the current sessions's timezone to the user's specific timezone.
Here is a gist with the migration, partial view and application controller filter:
https://gist.github.com/eladmeidar/6121183

Get hour from user and store in rails model + timezone

I have a rails view where the user is presented with a dropdown displaying the hours '00:00', '01:00' etc.
Once the user has selected this hour, then it is stored in the model with some other fields.
My application is working in timezone UTC+2 (I have set config.time_zone = 'Jerusalem').
At what stage to I related to timezones when handling this time on its path from the view to the model? If I use e.g. DateTime.strptime("10:00", "%H:%M").in_time_zone(Time.zone), then I get a time at '12:00' - while what I really would like is for the database to store in UTF (which should be 08:00 while the rest of the site works with local time.
You can use TZInfo ruby library http://tzinfo.rubyforge.org and convert your time with following method
def local_to_utc(date, time_zone)
begin
unless time_zone.nil?
tz = TZInfo::Timezone.get(time_zone)
return tz.local_to_utc(date)
end
rescue
return nil
end
end

Saving a Rails Record with a specific Timezone

How to save an event in Berlin with its own specific timezone and the next event in Tijuana with a different one?
The user is asked to choose a City for the event, as a source for e.g. +02:00.
I would like to receive a time code like this:
eventstart = "2011-07-22T18:00:00+02:00"
How would you go about creating that form?
UPDATE:
Realized saving as standard UTC is fine for many reasons. So now I am altering a time string in the view to present a *distance_to_time_in_words* for eventstart, depending on the user's local time.
Event in Tijuana, viewing from Berlin time:
old_zone = Time.zone
#=> "Berlin"
Time.zone = "Tijuana"
t = Time.zone.parse(eventstart.to_s[0..-7])
#=> 2011-07-22 18:00:00 +08:00
Time.zone = old_zone
#=> "Berlin"
distance_of_time_in_words(Time.now.in_time_zone, t)
#=> "9 hours"
cumbersome, but works for now. Improvement ideas welcome!
Add a time_zone column to your database and use time_zone_select in your form to let user select the time_zone for which he is creating event.
And in the model you can convert the datetime to zone specific datetime and store utc in the database. You can use helper something like below
def local_time(date)
Time.use_zone(self.time_zone) do
Time.zone.at(date.to_i)
end
end

Resources