如何使用模型中before_validation正确的时间覆盖模型中的datetime_select



我有一个表单,其中包含两个字段日期和时间,映射到一个数据库表列时间(日期时间)。字段日期是日期选取器的字符串字段,时间是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 查找所有时区。

问候,多里安

相关内容

  • 没有找到相关文章

最新更新