【问题标题】:How to apply time zone on datetime_select in Rails form如何在 Rails 表单中的 datetime_select 上应用时区
【发布时间】:2013-02-16 13:02:39
【问题描述】:

我有一个看起来像这样的表单

= form.datetime_select :due_at
= form.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones

当这个对象被保存时,我们需要它来应用选择的时区。例如,如果用户选择“03-01-2013 11:00”和“中部时间(美国和加拿大)”,我希望日期/时间,在本例中为 11AM CST 而不是我们的应用程序默认时区“太平洋时间(美国和加拿大)”。

这实际上嵌套在另一个表单中,因此我们不能简单地使用 around_filter 更改控制器中的 Time.zone。我们正在尝试找出一个在夏令时也可以使用的解决方案。

【问题讨论】:

  • due_attime_zone 都是模型上的属性吗?
  • @BenjaminSullivan 是的,在这种情况下,due_attime_zone 是模型的属性。

标签: ruby-on-rails datetime timezone


【解决方案1】:

如果due_attime_zone 都是单个模型的属性,那么您可以使用 before_save 挂钩来确保due_at 在存储到数据库之前以time_zone 的时区编码。

class YourModel < ActiveRecord::Base
  before_save :apply_time_zone

  protected

  def apply_time_zone
    self.due_at = ActiveSupport::TimeZone[time_zone].parse "#{due_at_start.to_s(:db)} UTC"
  end
end

ActiveSupport::TimeZone[t].parse(s)s 解析为t 时区,.to_s(:db) 将时间转换为UTC 字符串。

【讨论】:

  • 感谢这些编辑,我最近写了很多 javascript 哈哈。答案解决了你的问题吗?
  • 您能否参考#to_s(:db) 将时间转换为UTC 的源代码或示例,如您在修订中所述?据我所知#to_s:db 只是执行strftime 而没有任何时区更改。我在 Rails 2.3 中的测试证实了这一点。 github.com/rails/rails/blob/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多