【问题标题】:Saving a Rails Record with a specific Timezone使用特定时区保存 Rails 记录
【发布时间】:2011-10-11 04:39:33
【问题描述】:

如何用自己的特定时区保存 Berlin 中的事件和 Tijuana 中的下一个事件?

要求用户为事件选择一个城市,例如作为事件的来源。 +02:00.

我想收到这样的时间码:

eventstart = "2011-07-22T18:00:00+02:00"

您将如何创建该表单?

更新:

出于多种原因,实现保存为标准 UTC 是可行的。所以现在我正在更改视图中的时间字符串,以根据用户的本地时间为 eventstart 显示 *distance_to_time_in_words*。

蒂华纳的活动,从柏林时间观看:

old_zone = Time.zone
#=> "Berlin"
Time.zone = "Tijuana"
t = Time.zone.parse(eventstart.to_s[0..-7])
#=> 2011-07-22 18:00:00 +08:00
Time.zone = old_zone
#=> "Berlin"
distance_of_time_in_words(Time.now.in_time_zone, t)
#=> "9 hours"

很麻烦,但现在可以使用。欢迎提出改进意见!

【问题讨论】:

    标签: ruby-on-rails timezone


    【解决方案1】:

    在您的数据库中添加一个time_zone 列并在您的表单中使用time_zone_select 让用户选择他正在为其创建事件的time_zone

    在模型中,您可以将日期时间转换为特定于区域的日期时间并将 utc 存储在数据库中。您可以使用以下帮助程序

    def local_time(date)
      Time.use_zone(self.time_zone) do
        Time.zone.at(date.to_i)
      end
    end
    

    【讨论】:

    • 刚刚在模型 def local_time(date) Time.use_zone("Paris") do Time.zone.at(date.to_i) end end 中测试了这个。从<%= @event.local_time("2011-07-23 00:00:00 +0200") %> 的观点来看1970-01-01 01:33:31 +0100
    • 它对我有用,除非你在某处做错了(我们在项目中广泛使用)。您可以在 Rails 控制台或通过单元测试测试第一个 local_time 方法。如果你在控制台中尝试这个,它应该在巴黎时区打印时间。只需将代码复制粘贴到控制台code def local_time(d); Time.use_zone("巴黎") 做; Time.zone.at(d.to_i);结尾;结束;local_time(Time.parse("2011-07-23 00:00:00")) code.您不能像上面的评论中那样将字符串传递给 local_time。你应该传递日期或日期时间对象。
    • 它有效,一定是我丢失的日期时间对象。谢谢
    • 很抱歉回来了,但我刚刚意识到,虽然您的解决方案在其自身方面有效,但我需要不同的行为。您的解决方案将 2011-07-23 01:00:00 +0100 转换为 2011-07-22 21:00:00 -0300:我需要时间在收到新时区。所以在这个例子中像 _2011-07-23 01:00:00 -0300 这是类似的问题,我刚刚遇到:stackoverflow.com/questions/5074238/…
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多