考虑到时钟变化,设置正确的UTC日期时间



我有一个ruby on rails应用程序,它可以创建事件,从前端开始,事件的日期以山地时间生成,然后应用程序将其转换为UTC。

问题是,由于事件是在未来生成的,有时我们会遇到时钟变化的问题。

假设事件应该发生:

Day X at 9:30 MT

它将被转换为:

Day X at 14:30 UTC

但是,如果我们在未来创建一个事件,该事件发生在时钟更改的那一周,我们将在错误的时间配置一个事件。因为它没有考虑时钟更改。

有没有一种方法可以从特定时区生成UTC日期时间,考虑到时钟是否会在该日期发生变化?

根据Rails API如果您的应用程序将其时区配置为山地时间(MT(,夏令时(DST(默认情况下工作

# 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

因此,如果活动日期在DST更改,解析(请参阅ActiveSupport::TimeWithZone(该日期应返回相应的时间

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

您提到应用程序将其转换为UTC。所以如果我假设,正确的UTC日期被传递到后端(可能是ISO8601编码的字符串(,您应该解析它,并通过以下操作将其转换到应用程序时区:

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

最新更新