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も、SQLクエリに入ると、DateTime.now.end_of_dayが正しくフォーマットされていないことがわかります。これを特定の方法でフォーマットする必要がありますか?今日の7:00と明日の7:00に行く理由はありますか?

違いがあるかどうかはわかりませんが、PostgreSQLを使用しています。

ありがとう!

4

3 に答える 3

17

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

上で引用している時間は実際には同じ時間だと思います。1つだけがUTC時間です(太平洋時間ですよね?)。これを修正するには、次の設定を試してください。

config.time_zone = "太平洋標準時(米国およびカナダ)"

あなたのenvironment.rbで

また、試すことができます:

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

したがって、DBに従ってUTCを使用しています

于 2012-04-10T02:25:26.857 に答える
2

データベースでUTC時刻を使用している可能性があります。これは良いことですが、あらゆる種類の混乱を招きます。-0700オフセットは、1日がUTC時間で始まるときに変換されます07:00:00

于 2012-04-10T02:17:13.103 に答える
2

AT TIME ZONEUTCタイムスタンプで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 に答える