Rails 3 DateTime和time begin_of_day end_of_day格式不正确

时间:2012-04-10 02:14:14

标签: ruby-on-rails ruby-on-rails-3 postgresql

我正在尝试使用此代码查找特定日期的事件:

Event.where('starttime BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day)

在rails控制台中,如果我运行DateTime.now.beginning_of_day,我会得到我期望的结果:

星期一,2012年4月9日00:00:00 -0700

我可以看到问题出在哪里但是在rails控制台中查看SQL。不知何故,当日期进入SQL查询时,它会自动格式化为错误的日期和时间。

SELECT "events".* FROM "events" WHERE (starttime BETWEEN '2012-04-09 07:00:00' AND '2012-04-10 06:59:59')

这给我的结果从今天到明天各不相同,正如上面的sql所说。我可以看到,当DateTime.now.beginning_of_day也使DateTime.now.end_of_day进入sql查询时,它们的格式不正确。我需要以某种方式格式化吗?知道为什么会到今天的7点和明天的7点?

我不知道它是否有所作为,但我正在使用PostgreSQL。

谢谢!

3 个答案:

答案 0 :(得分:16)

请参阅:http://railscasts.com/episodes/106-time-zones-in-rails-2-1

我认为你上面引用的时间实际上是同一时间,只有一个是UTC时间(你是在太平洋时间吗?)。要解决此问题,您可以尝试设置:

config.time_zone =“太平洋时间(美国和加拿大)”

你环境中的

.rb

您也可以尝试:

DateTime.now.utc.beginning_of_day
DateTime.now.utc.end_of_day 

所以你按照DB使用UTC

答案 1 :(得分:2)

您可能在数据库中使用UTC时间。这是一件好事,但它会导致各种混乱。 -0700偏移量将转换为07:00:00,因为那时您的日期是以UTC时间开始的。

答案 2 :(得分:1)

您可以使用带有UTC时间戳的PostgreSQL AT TIME ZONE构造:

SELECT e.*
FROM   events e
WHERE  starttime >= '2012-04-09 00:00' AT TIME ZONE 'UTC'
AND    starttime <  '2012-04-10 00:00' AT TIME ZONE 'UTC'

我最近解释了PostgreSQL timestamp and time zone handling in a related answer