如何使用具有正确时间的模型中的before_validation过滤器覆盖datetime_select?

时间:2012-05-08 09:20:43

标签: ruby-on-rails ruby-on-rails-3 datetime timezone

我有一个表单,其中包含两个字段的日期和时间,映射到一个db表列时间(datetime)。 字段日期是datepicker的字符串字段,time是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

1 个答案:

答案 0 :(得分:0)

您可以像这样使用in_time_zone method

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找到所有时区。

问候,多利安