在更新用户输入的时区后以UTC格式存储日期以反映正确的UTC时间

时间:2014-04-24 23:02:59

标签: ruby-on-rails ruby datetime ruby-on-rails-4

我有一个事件模型,它有开始和结束日期/时间以及相关的时区。

我需要提交的日期时间根据输入的时区以正确的UTC版本存储。

示例,如果用户提交2014-04-24 7PM EST

数据库应为:

  

2014-04-24T23:00:00.000Z

不是这个:

  

2014-04-24T19:00:00.000-07:00

好的,我知道rails以UTC,存储所有内容但我需要根据时区存储更新的UTC时间 - 因为我的表单是3个字段,x2日期/时间& x1时区

这是我认为可以正常运行的模型验证:

  def calc_utc_based_off_timezone
    time_zone = self.time_zone

    puts "start date before assignment: "
    puts self.start_date

    self.start_date = self.start_date.in_time_zone(time_zone)
    self.end_date = self.end_date.in_time_zone(time_zone)

    puts "start date after assignment: "
    puts self.start_date
  end

以我的形式输入:

  

2014-04-24 - 19:00

     

2014-04-26 - 19:00

     

EST

输出:

  

转让前的开始日期:

     

2014-04-24 19:00:00 UTC

     分配后

开始日期:

     

2014-04-24 19:00:00 UTC

我期待的是:

  

转让前的开始日期:

     

2014-04-24 19:00:00 UTC

     分配后

开始日期:

     

2014-04-24 23:00:00 UTC< - 更新UTC以反映时区

任何帮助都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

你是对的,Rails ActiveSupport中有一些东西,

Time.parse("2014-04-24 - 19:00").in_time_zone

Thu, 24 Apr 2014 23:00:00 UTC +00:00

Time.parse("2014-04-24 - 19:00").getutc

2014-04-24 23:00:00 UTC

您还可以通过传递其他参数来指定响应的详细信息和格式(如iso8601):

> Time.parse("2014-04-24 - 19:00").getutc.iso8601(2)
"2014-04-24T23:00:00.00Z"
> Time.parse("2014-04-24 - 19:00").getutc.iso8601(3)
"2014-04-24T23:00:00.000Z"

ActiveSupport :: TimeWithZone的文档:http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-getutc

答案 1 :(得分:0)

ActiveSupport::TimeWithZone类支持带有时区的Time对象。 只要在将参数提供给新对象函数Event.new(params[:event])之前设置时区,rails将应用设置的偏移量,并将其解释为在该时区中的偏移量。

# example params like the request
params = {
          time_zone:"EST",
          event:{
            start_date:"2014-04-24 - 19:00",
            end_date:"2014-04-26 - 19:00"}
          }   

Time.zone = params[:time_zone] # pulled from a time_zone_select field
@event = Event.new(params[:event])

如果您有单独的时间和日期字段,只需将它们组合到数据库中保存日期时间的任何字段。

params[:event][:start_date] = "#{params[:event][:start_date]} #{params[:event][:start_time]}"
params[:event][:end_date] = "#{params[:event][:end_date]} #{params[:event][:end_time]}"

@event = Event.new(params[:event])

时区偏移将自动应用,如果您检查对象,则应获得以下内容。

> puts @event.start_date
2014-04-25 00:00:00 UTC
> puts @event.end_date
2014-04-27 00:00:00 UTC

以下是处理Rails和时区的精彩指南 - The Exhaustive Guide to Rails Time Zones