Ruby时区 - 到UTC和返回

时间:2016-01-28 17:07:20

标签: mysql ruby timezone dst

我运行一个允许用户为其帐户设置时区的计划站点。然后他们可以安排发布帖子'在该时区的日历上。在后端,我花时间将其转换为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时间。谢谢!

1 个答案:

答案 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部分。