首页 > 解决方案 > Ruby - 获取特定日期和时间的纬度和经度的时区偏移量

问题描述

我正在使用timezone gem 从纬度和经度获取时区。我需要时区来进行一些太阳计算。我使用的 API 需要时区偏移(没有日光)。例如,现在 ( 2021/10/12 12:37) 在英国使用 BST 时间,API 的时区偏移量将为零。timezone虽然我会得到3600

tz = Timezone.lookup(51.51, 0.1)
=> #<Timezone::Zone name: "Europe/London">
tz.utc_offset
=> 3600

这很容易。我可以检查夏令时并纠正。

(tz.dst?) ? (tz.utc_offset) : (tz.utc_offset - 3600)

只要它在我的语言环境时区中,我就可以再次执行相同的操作(我在 2010 年进行了所有计算)。

如果我尝试在墨尔本,我无法在该位置创建时间并检查夏令时。我确定我做错了什么。我是不是想多了?

例如:

tz = Timezone.lookup(-37.814, 145)
=> #<Timezone::Zone name: "Australia/Melbourne">
tz.utc_offset
=> 39600 ((10 + 1)h)

现在是 ( 2021/10/12 12:37),但要让我的 API 工作,这应该是 10,因为不应该包括日光。

我的想法是取一个参考时间,2010/01/01 01:00 并为该时间进行所有计算。问题是我不知道如何在特定时区创建时间并检查该时间是否为日光时间。

我努力了

reftime = tz.time(Time.new(2010,1,1,1,0))

但如果这样做

reftime = tz.time(Time.new(2010,1,1,1,0))
reftime.dst?

我明白false了,但这应该是真的。

如何检查特定位置的特定日期是否处于夏令时模式?

标签: rubytimetimezonetimezone-offset

解决方案


墨尔本已于 2021-10-03 03:00:00 开始实行夏令时。所以它使用的是AEDT,而不是AEST。


推荐阅读