首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不同时区中显示Rails表单日期时间的选择?

如何在不同时区中显示Rails表单日期时间的选择?
EN

Stack Overflow用户
提问于 2013-08-21 23:09:36
回答 2查看 5.1K关注 0票数 1

我想在用户的首选时区中向用户显示一个日期时间选择,但将日期时间存储为UTC。当前,默认行为是使用UTC显示和存储日期时间字段。如何在不影响整个应用程序(即不更改应用程序默认时区)的情况下更改此字段的行为?

更新:--这不是每个用户的时区.我不需要调整时间的显示方式。只有这些特定的字段处理不同的时区,所以我希望用户能够指定这个时区中的时间。

EN

回答 2

Stack Overflow用户

发布于 2013-08-22 19:13:21

下面是允许用户使用特定时区设置日期的方法:

若要将表单中提交的多参数属性转换为特定的时区,请在控制器中添加一个方法,将params手动转换为datetime对象。我选择将它添加到控制器中,因为我不想影响模型行为。您仍然应该能够在模型上设置日期,并假定您的日期已被正确设置。

代码语言:javascript
运行
复制
def create
  convert_datetimes_to_pdt("start_date")
  convert_datetimes_to_pdt("end_date")
  @model = MyModel.new(params[:my_model])
  # ...
end

def update
  convert_datetimes_to_pdt("start_date")
  convert_datetimes_to_pdt("end_date")
  # ...
end

def convert_datetimes_to_pdt(field)
  datetime = (1..5).collect {|num| params['my_model'].delete "#{field}(#{num}i)" }
  if datetime[0] and datetime[1] and datetime[2] # only if a date has been set
    params['my_model'][field] = Time.find_zone!("Pacific Time (US & Canada)").local(*datetime.map(&:to_i))
  end
end

现在,日期时间将调整到正确的时区。但是,当用户编辑时间时,表单字段仍将显示UTC中的时间。要解决这个问题,我们可以在调用Time.use_zone时将字段包装起来

代码语言:javascript
运行
复制
Time.use_zone("Pacific Time (US & Canada)") do
  f.datetime_select :start_date
end
票数 6
EN

Stack Overflow用户

发布于 2013-08-21 23:38:44

有几种选择:

  • 在向用户显示数据时利用用户的本地时区。对于浏览器-时区-rails这样的创业板来说,这真的很容易。见https://github.com/kbaum/browser-timezone-rails。它实际上是根据从浏览器检测到的时区重写每个请求的应用程序时区。注意:它只使用OS时区,因此不像基于IP/geo的解决方案那样精确。
  • 设置应用程序时区,使其与大多数用户一致。例如:config.time_zone = 'Mountain Time (US & Canada)'。在rails中这是一件非常标准的事情。Rails将始终以UTC的形式将数据存储在DB中,但将使用应用程序时区显示/加载数据。
  • 为用户模型创建一个时区。允许用户在其帐户设置中设置此值。然后,在application_controller中使用类似于上述gem的方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18369103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档