Ruby 时区 — 到 UTC 并返回



我运行一个调度网站,允许用户为其帐户设置时区。然后,他们可以在该时区的日历上安排"帖子"。在后端,我花时间并将其转换为 UTC 时间(工作人员在 UTC 时间处理并获取这些帖子)。

我在Ruby上运行网站(使用Puma/Sinatra),但没有Rails,我想远离Rails。前面有 HTML/ERB/JS,还有一个 MYSQL 后端。

我认为简单地添加/减去 UTC 偏移量就可以解决所有问题。我有一个简单的列表,它TIMEZONE <--> UTCOFFSET,效果很好——至少我是这么认为的。

然后我意识到当给定时区(或地点)当前处于夏令时时,这不起作用。

夏季维也纳: UTC 偏移: +2h

冬季维也纳: UTC 偏移: +1h

有没有一种简单的方法可以给Ruby(而不是Rails)一个"时区ID"并接收正确的调整后的UTC偏移量?

喜欢:

user.timezone = "Europe/Vienna"
utc_adjusted_time = post.local_time.to_i + get_utc_offset(user.timezone)

get_utc_offset在哪里知道它是否在夏令时。 有什么想法吗?

我浏览了IANA数据库(这绝对是矫枉过正),我在Github上搜索了许多Gist,我试图滥用Rails似乎拥有的任何内容,但没有走得太远。

你们是怎么处理的?理想情况下,如前所述,每个帖子将被转换并保存到 DST 剥离的 UTC 时间。谢谢!

只需使用 Ruby TZInfo gem。

您的用例与自述文件中显示的完全相同:

require 'tzinfo'
tz = TZInfo::Timezone.get('America/New_York')
local = tz.utc_to_local(Time.utc(2005,8,29,15,35,0))
utc = tz.local_to_utc(local)
period = tz.period_for_utc(Time.utc(2005,8,29,15,35,0))
id = period.zone_identifier

查看文档以获取TZInfo::TimePeriod,您可以看到您询问的其他信息:

period.offset
period.dst?

。等。

仅供参考 - 无论如何,Rails 时区支持都是基于这个宝石的。 然后 Rails 去在顶部放置一些时髦的混叠(我建议不要使用)。 请参阅时区标签维基中关于 Rails 的部分。

相关内容

  • 没有找到相关文章

最新更新