Kerby82
Kerby82

Reputation: 5146

Set the right UTC DateTime considering clock changes

I have a ruby on rails app that creates event, from the frontend the date of the event is generated in Mountain Time and then the application transforms it in UTC.

The issue is that since the events are generated in the future sometimes we have issues with the clock change.

Let's say the event should happen:

Day X at 9:30 MT

It would be transformed in:

Day X at 14:30 UTC

But if we create an event in the future that fall in the week the clock change we would have an event configured at the wrong time, because it does not take into consideration the clock change.

Is there a way to generate a UTC dateTime from a specific TimeZone considering if the clock change would happen in that date?

Upvotes: 0

Views: 77

Answers (1)

R. Sierra
R. Sierra

Reputation: 1204

According to Rails API if your app has its time zone configured as Mountain Time(MT), Daylight Saving Time(DST) works by default

# application.rb:
class Application < Rails::Application
  config.time_zone = 'Mountain Time (US & Canada)'
end

Time.zone      # => #<ActiveSupport::TimeZone:0x000000...>
Time.zone.name # => "Mountain Time (US & Canada)"
Time.zone.now  # => Tue, 14 Dec 2021 09:46:09 MST -07:00

So if the event date falls after the DST change, parsing (see ActiveSupport::TimeWithZone) that date should return the appropiate time

time = Time.zone.parse('2022-03-13 01:00:00') # the parsed datetime is in the same timezone
 => Sun, 13 Mar 2022 01:00:00 MST -07:00
time.dst?
 => false
time = Time.zone.parse('2022-03-13 02:00:00')
 => Sun, 13 Mar 2022 03:00:00 MDT -06:00
time.dst?
 => true

You mention that the application transforms it to UTC. So if I assume, the correct UTC date is passed to the backend(maybe as an ISO8601 encoded string), you should parse it and convert it to the app time zone by doing something like this:

  date = params[:date]
  # => "2021-12-14 18:05:05"
  utc_datetime = DateTime.parse(date, "%Y-%m-%d %H:%M:%S")
  => 2021-12-14 18:05:05 +0000
  mt_datetime = utc_datetime.in_time_zone
  => 2021-12-14 11:05:05 MST -07:00
  ...
end

Upvotes: 1

Related Questions