7

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

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:00 和明天 7:00 吗?

我不知道这是否有区别,但我正在使用 PostgreSQL。

谢谢!

4

3 回答 3

17

请参阅: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 

所以你根据数据库使用UTC

于 2012-04-10T02:25:26.857 回答
2

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

于 2012-04-10T02:17:13.103 回答
2

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

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 时间戳和时区处理

于 2012-04-10T02:37:31.120 回答