1

我的服务器有系统时区“欧洲/巴黎”

我配置了我的 Rails 应用程序(Rails 3.29) config.time_zone = 'Europe/London' config.active_record.default_timezone = :utc

所有事件的开始/结束日期都存储在数据库中:“2013-01-02 10:00:00”

问题在于范围

scope :starting, lambda {|start_date_time|
  {:conditions => ["starts_at = ?", Event.db_datetime(start_date_time)] }
}
...
def self.db_datetime(date_time)
  Time.at(date_time.to_i).utc.to_s(:db)
end

当我创建 start_date_time 过滤器时,我得到一个系统本地时区日期时间 start_date_time = Time.new(2013, 1, 2, 10, 0, 0) 2013-01-02 10:00:00 +0100

and Event.db_datetime(start_date_time) gives "2013-01-02 09:00:00" 
which cannot be found 

有没有办法强制 utc datetime 所以: start_date_time = Time.new(2013, 1, 2, 10, 0, 0) 会给 2013-01-02 10:00:00 UTC

感谢您的反馈

4

1 回答 1

3

Time.at - 或Time.new - 解析系统本地时区的时间,此处显示为 UTC+1。这就是为什么解析 UTC+1 中的 10:00 变成 UTC 中的 09:00。

我认为您正在寻找的功能是

Time.zone.at                             #equivalent to Time.at
Time.zone.local(2013, 1, 2, 10, 0, 0)    #equivalent to Time.new

它将在定义的时区中解析给定的日期和时间

config.time_zone = 'Europe/London' 

其结果是一个TimeWithZone对象,它是 Rails 对 ruby​​ Time的扩展。

您可以查看此文档页面http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html以获取有关 TimeWithZone 的更多信息。

你可以这样使用它;db_datetime(date_time) 方法不再是必需的:

# class Event
scope :starting, lambda {|start_date_time|
  {:conditions => ["starts_at = ?", start_date_time.to_s(:db)] }
}
# I think to_s(:db) already handle the .utc conversion part



## example
start_date_time = Time.zone.local(2013, 1, 2, 10, 0, 0) 
Event.starting(start_date_time)
于 2012-12-05T13:55:00.743 回答