【发布时间】:2023-09-15 12:57:01
【问题描述】:
我需要在 Ruby 中计算给定时区与 UTC 的偏移量(以小时为单位)。这行代码一直在为我工作,或者我认为:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f / 3600.0
但是,事实证明这是返回给我的标准偏移量,而不是 DST 偏移量。例如,假设
self.timezone = "America/New_York"
如果我运行上面的行,offset_in_hours = -5,而不是应该的 -4,因为今天的日期是 2012 年 4 月 1 日。
任何人都可以告诉我如何根据 UTC 计算 offset_in_hours 给定一个有效的 Ruby 字符串 TimeZone,它同时考虑了标准时间和夏令时?
谢谢!
更新
这是 IRB 的一些输出。请注意,由于夏令时,纽约比 UTC 晚 4 小时,而不是 5 小时:
>> require 'tzinfo'
=> false
>> timezone = "America/New_York"
=> "America/New_York"
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset / (60*60)
=> -5
>>
这表明 TZInfo 中存在错误或者它不支持 dst
更新 2
根据 joelparkerhender 的 cmets,上述代码中的错误是我使用的是 utc_offset,而不是 utc_total_offset。
因此,根据我最初的问题,正确的代码行是:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f / 3600.0
【问题讨论】: