我运行一个调度网站,允许用户为其帐户设置时区。然后,他们可以在该时区的日历上安排"帖子"。在后端,我花时间并将其转换为 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 的部分。