Ruby on rails 如何在不同的时区显示Rails表单datetime select?
我想向用户提供一个选择日期时间的时区,但将日期时间存储为UTC。当前,默认行为是使用UTC显示和存储datetime字段。如何更改此字段的行为而不影响整个应用程序(即不更改应用程序默认时区)Ruby on rails 如何在不同的时区显示Rails表单datetime select?,ruby-on-rails,ruby,forms,datetime,timezone,Ruby On Rails,Ruby,Forms,Datetime,Timezone,我想向用户提供一个选择日期时间的时区,但将日期时间存储为UTC。当前,默认行为是使用UTC显示和存储datetime字段。如何更改此字段的行为而不影响整个应用程序(即不更改应用程序默认时区) 更新:这不是每个用户的时区。我不需要调整时间的显示方式。只有这些特定字段处理不同的时区,因此我希望用户能够指定此时区中的时间。有两个选项: 向用户显示数据时,利用用户的本地时区。使用类似浏览器timezone rails gem的东西,这真的很容易。看见它实际上是根据从浏览器检测到的时区覆盖每个请求的应用
更新:这不是每个用户的时区。我不需要调整时间的显示方式。只有这些特定字段处理不同的时区,因此我希望用户能够指定此时区中的时间。有两个选项:
- 向用户显示数据时,利用用户的本地时区。使用类似浏览器timezone rails gem的东西,这真的很容易。看见它实际上是根据从浏览器检测到的时区覆盖每个请求的应用程序时区。注意:它只使用操作系统时区,因此不如基于IP/geo的解决方案准确
- 设置应用程序时区,使其与大多数用户一致。例如:
。在rails中,这是一个非常标准的操作。Rails将始终以UTC的形式在数据库中存储数据,但将使用应用程序时区显示/加载数据config.time\u zone='Mountain time(美国和加拿大)
- 为您的用户模型创建时区。允许用户在其帐户设置中设置此值。然后在应用程序_控制器中使用与上述gem类似的方法
- 向用户显示数据时,利用用户的本地时区。使用类似浏览器timezone rails gem的东西,这真的很容易。看见它实际上是根据从浏览器检测到的时区覆盖每个请求的应用程序时区。注意:它只使用操作系统时区,因此不如基于IP/geo的解决方案准确
- 设置应用程序时区,使其与大多数用户一致。例如:
。在rails中,这是一个非常标准的操作。Rails将始终以UTC的形式在数据库中存储数据,但将使用应用程序时区显示/加载数据config.time\u zone='Mountain time(美国和加拿大)
- 为您的用户模型创建时区。允许用户在其帐户设置中设置此值。然后在应用程序_控制器中使用与上述gem类似的方法
- 有两种选择:
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
现在,datetime将被调整到正确的时区。但是,当用户编辑时间时,表单字段仍将以UTC显示时间。要解决此问题,我们可以在调用Time时包装字段。使用\u zone
:
Time.use_zone("Pacific Time (US & Canada)") do
f.datetime_select :start_date
end
以下是允许用户使用特定时区设置日期的方法: 要将表单中提交的多参数属性转换为特定时区,请在控制器中添加一个方法,以手动将参数转换为datetime对象。我选择将其添加到控制器,因为我不想影响模型行为。您应该仍然能够在模型上设置日期,并假设您的日期设置正确
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
现在,datetime将被调整到正确的时区。但是,当用户编辑时间时,表单字段仍将以UTC显示时间。要解决此问题,我们可以在调用Time时包装字段。使用\u zone
:
Time.use_zone("Pacific Time (US & Canada)") do
f.datetime_select :start_date
end
你有没有试过使用宝石?或者您正在寻找客户端JavaScript解决方案?可能会显示一些代码??)不,不是客户端。是的,我已经在特定区域显示时间时使用了标准时区帮助程序,即
time.now.in_time_zone(“太平洋时间(美国和加拿大)”)
。但是,现在我需要更改窗体显示相对于给定时区的值的方式。您是否尝试使用或gem?或者您正在寻找客户端JavaScript解决方案?可能会显示一些代码??)不,不是客户端。是的,我已经在特定区域显示时间时使用了标准时区帮助程序,即time.now.in_time_zone(“太平洋时间(美国和加拿大)”)
。但是,现在我需要更改窗体显示相对于给定时区的值的方式。谢谢您的回答。对不起,我不清楚。这不是每个用户的时区,而是与应用程序默认时区不同的特定时区。我只需要调整窗体显示时间选择的方式。它应该显示应用了时区偏移的值。我认为在显示在表单中之前,您需要将日期时间转换为所需的时区。您可以使用Time.use\u zone的块形式来执行此操作。Time.use\u zone(“您要使用的时区”)do study\u at=Time.zone.parse('datetime string')endOK,将表单字段包装为Time。编辑表单时,use\u zone
起作用,现在我只需要知道在保存值时在哪里使用它。谢谢你的回答。对不起,我不清楚。这不是每个用户的时区,而是与应用程序默认时区不同的特定时区。我只需要调整窗体显示时间选择的方式。它应该显示应用了时区偏移的值。我认为在显示在表单中之前,您需要将日期时间转换为所需的时区。您可以使用Time.use\u zone的块形式来执行此操作。Time.use\u zone(“您要使用的时区”)do study\u at=Time.zone.pa