考虑时钟变化设置正确的 UTC DateTime
Posted
技术标签:
【中文标题】考虑时钟变化设置正确的 UTC DateTime【英文标题】:Set the right UTC DateTime considering clock changes 【发布时间】:2022-01-17 22:20:06 【问题描述】:我有一个创建事件的 ruby on rails 应用程序,从前端以山地时间生成事件的日期,然后应用程序将其转换为 UTC。
问题在于,由于事件是在未来生成的,因此有时我们会遇到时钟更改问题。
假设事件应该发生:
Day X at 9:30 MT
它会变成:
Day X at 14:30 UTC
但是,如果我们在时钟更改的那一周创建一个事件,我们将在错误的时间配置一个事件,因为它没有考虑时钟更改。
考虑到时钟是否会在该日期发生变化,有没有办法从特定时区生成 UTC 日期时间?
【问题讨论】:
“未来一周内发生时钟变化的事件” – 你能举个例子吗? “第 X 天”不是很具体,我不太确定您要解决什么问题。 【参考方案1】:根据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
所以如果活动日期在after 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
【讨论】:
以上是关于考虑时钟变化设置正确的 UTC DateTime的主要内容,如果未能解决你的问题,请参考以下文章
linux下的硬件时钟存储的时间是UTC时间还是用户设定的时区时间(比如说北京时间)?