我运行一个允许用户为其帐户设置时区的计划站点。然后他们可以安排发布帖子'在该时区的日历上。在后端,我花时间将其转换为UTC时间(工作人员在UTC时间处理并接收这些帖子)。
我在Ruby(使用Puma / Sinatra)上运行该站点,但没有Rails,我想远离Rails。前面有HTML / ERB / JS和MYSQL后端。
我认为简单地添加/减去UTC偏移将解决所有问题。我有一个简单的列表TIMEZONE <--> UTCOFFSET
,这很有效 - 或者我认为。
然后我意识到当给定的时区(或地点)当前在DST中时,这不起作用。
夏天的维也纳:UTC偏移:+ 2h
冬天的维也纳:UTC偏移:+ 1h
是否有一种简单的方法可以为Ruby(而不是Rails)提供一个&#34;时区ID&#34;然后收到正确的调整后的UTC偏移?
像:
user.timezone = "Europe/Vienna"
utc_adjusted_time = post.local_time.to_i + get_utc_offset(user.timezone)
get_utc_offset
知道是否在DST中。有什么想法吗?
我已经浏览了IANA数据库(这绝对是一种矫枉过正的行为),我已经通过Github上的众多Gists进行了搜索,我试图滥用Rails似乎拥有的任何数据,但没有&#39 ;走得很远。
你们怎么处理这个?理想情况下,如上所述,每个帖子都将被转换并保存到DST剥离的UTC时间。谢谢!
答案 0 :(得分:0)
只需使用Ruby TZInfo gem即可。
您的用例正好是显示in the readme:
的用例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时区支持基于此gem。然后Rails会在顶部放置一些时髦的别名(我建议不要使用)。请参阅the timezone tag wiki中的Rails部分。