考虑时钟变化设置正确的 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的主要内容,如果未能解决你的问题,请参考以下文章

把华为交换机设置成时钟源服务器(NTP)

linux下的硬件时钟存储的时间是UTC时间还是用户设定的时区时间(比如说北京时间)?

Swift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化

Linux 系统管理命令

在 Linux 上实时显示`date`的变化

linux NTP 配置