最简单的方法是在rails中为非时区偏移量转换DateTime

时间:2015-11-03 23:18:34

标签: ruby-on-rails postgresql

我有一个rails应用程序,它在application.rb中设置了时区:

config.time_zone ='太平洋时间(美国和加拿大)'

我想节省时间:

day, hour=25, 10
....
params[:order][:pickup_at] = DateTime.new(2015,11,day,hour,00,00)

并认为它会写为

2015-11-25 18:00:00 

进入我们的表,这是Postgres 9.4实例,pickup_at是没有时区的时间戳。

取而代之的是:

2015-11-25 10:00:00 

做:

params[:order][:pickup_at] =DateTime.new(2015,11,25,10,00,00).in_time_zone("Pacific Time (US & Canada)")

没有修复。看来我想要做的很简单。进入时间戳调整我们当前设置的时区并进行相应调整。

我将如何使这项工作?

1 个答案:

答案 0 :(得分:0)

DateTime的默认偏移量为0,这意味着它默认为UTC提供了一个DateTime对象("非时区' d"正如你所说的那样):

http://ruby-doc.org/stdlib-2.2.3/libdoc/date/rdoc/DateTime.html#method-c-new

如果您要指定的UTC时间是2015-11-25 18:00:00,则应写入:

day, hour=25, 10
....
params[:order][:pickup_at] = DateTime.new(2015,11,day,hour,00,00,'-8')

最后一个-8参数是偏移量,它告诉DateTime您的时区是在PST中。

DateTime.new(2015,11,day,hour,00,00,'-8').utc 

然后产生:

Wed, 25 Nov 2015 18:00:00 +0000

如果你想在你的应用程序的时区中使用它,你可以写:

day, hour = 25, 10
# Take application timezone offset in seconds and convert it to hours
hour_offset = Time.zone.utc_offset / 60 / 60 
params[:order][:pickup_at] = DateTime.new(2015,11,day,hour,00,00, hour_offset.to_s).utc