0

我有一个包含两个字段日期和时间的表单,它们映射到一个数据库表列时间(日期时间)。字段日期是 datepicker 的字符串字段,时间是 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
4

1 回答 1

0

您可以像这样使用 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

问候, 多里安

于 2012-05-08T11:07:46.857 回答