我有一个表单,其中包含两个字段日期和时间,映射到一个数据库表列时间(日期时间)。字段日期是日期选取器的字符串字段,时间是datetime_select。由于我不在UTC时区,所以我必须在set_date方法中减去两个小时。
如何以更通用的方式实现这一点?
# Model
class Task < ActiveRecord::Base
before_validation :set_date
def set_date
if self.date
begin
date = Date.strptime(self.date, '%d.%m.%Y')
rescue
errors.add(:date, "invalid date")
return false
end
# can not get minutes by self.time.minute
self.time = DateTime.new(date.year, date.month, date.mday, self.time.hour.to_i, self.time.strftime("%M").to_i)
# have to set local time manually
self.time = self.time - 2.hours
end
end
# Form
<%= simple_form_for(@task) do |f| %>
<%= f.input :date, :as => :string, :input_html => { :class => 'asdatepicker'} %>
<%= f.input :time, :as => :datetime, :minute_step => 5, :input_html => { :class => 'input-small'} %>
...
# application.rb
config.time_zone = 'Berlin'
config.active_record.default_timezone = :local
你可以像这样使用 in_time_zone 方法:
self.time = DateTime.new(2012, 1, 1, 10, 0, 0).in_time_zone("Mid-Atlantic")
# => Sun, 01 Jan 2012 08:00:00 GST -02:00
您可以使用 rake time:zones:all
查找所有时区。
问候,多里安