2011-06-22 50 views
3

如果我有一个来自客户端的形式为"Wed, 22 Jun 2011 09:43:58 +0200"的时间字符串,我希望将其保存为保留的时区。这很重要,因为它不仅仅是绝对的UTC时间,而且也是时区。在Rails中保留时区

Time.zone.parse(t)会将时间转换为Time.zone当时正在使用的任何区域,从而丢失源时区。

我必须从上面的字符串手动提取时区还是有一种惯用的方式来做到这一点?

回答

6

DateTime字段只能存储'YYYY-MM-DD HH:MM:SS'(MySQL),没有时区信息。

您应该使用UTC存储日期时间,并将时区存储在其他字段中,最好是指定与UTC的偏移量(分钟)的整数。

您可以提取抵消这样的:

ruby-1.9.2-p180:001:0>> require 'active_support/all' # included by Rails by default 
# => true 
ruby-1.9.2-p180:002:0>> dt = DateTime.parse "Wed, 22 Jun 2011 09:43:58 +0200" 
# => Wed, 22 Jun 2011 09:43:58 +0200 
ruby-1.9.2-p180:003:0>> dt.utc_offset 
# => 7200 
ruby-1.9.2-p180:004:0>> dt.utc 
# => Wed, 22 Jun 2011 07:43:58 +0000 

编辑:

而对于往返的锻炼; Tibial

ruby-1.9.2-p180 :039 > u.utc.new_offset(u.offset) 
=> Wed, 22 Jun 2011 09:43:58 +0500 
ruby-1.9.2-p180 :040 > u 
=> Wed, 22 Jun 2011 09:43:58 +0500 
+0

感谢您的。以及如何从两个组件重新组装原始字符串?然后我就定了。 – bradgonesurfing

+0

我似乎无法找到合理的方式来做到这一点。 'dt2 = DateTime.parse“Wed,22 Jun 2011 07:43:58 +0000”; dt2 + = 7200.秒;'可以为你的情况。 – Dogbert

+0

'dt2.change(:offset => Rational(7200,86400))'如果您还想更改DateTime对象中的偏移量。 – Dogbert

1

我认为你正在寻找以下解决方案:

在ApplicationController中:

before_filter :get_tz 

def get_tz 
    @tz = current_user.time_zone 
end 

def use_tz 
    Time.use_zone @tz do 
    yield 
    end 
end 

并在控制器在beginnig周围添加过滤器

around_filter :use_tz