我们有一个非常简单的支付模型,默认为"created_at" datetime字段,我们必须在日期范围内搜索,所以我这样做:
>> Payment.all(:conditions =>
["Date(payments.created_at) >= ? and
Date(payments.created_at) <= ?", start_date, end_date])
我有一个问题与日期功能。例如
>> Payment.find(2577).created_at
=> Thu, 15 Dec 2011 18:15:00 UTC +00:00
,
>> Payment.find(2577).created_at.localtime
=> Fri Dec 16 01:15:00 +0700 2011
所以当我们搜索12月16日的付款时,我们没有得到任何结果,因为Date(payments.created_at)将UTC时间转换为日期,该日期被转换为12月15日。
是否可以修改Date(payments.created_at),以便它搜索本地时区的日期?我们使用Rails 2.3.5和postgresql。
终于成功了!不是很漂亮(我希望有一个更干净的解决方案),但这是有效的:
>> Payment.all(:conditions =>
["Date((payments.created_at at time zone 'UTC')
at time zone :timezone) >= :start_date and
Date((payments.created_at at time zone 'UTC')
at time zone :timezone) <= :end_date",
:start_date => start_date, :end_date => end_date,
:timezone => 'Asia/Katmandu'])
不太喜欢这样做:
Date((payments.created_at at time zone 'UTC') at time zone 'Asia/Katmandu')
为什么postgresql不允许你这样做?
Date(payments.created_at at 'Asia/Katmandu')
您可以在start_date和end_date上运行.localtime吗?比如:
Payment.all(:conditions =>
["Date(payments.created_at) >= ? and
Date(payments.created_at) <= ?", start_date.localtime, end_date.localtime])
您也可以在config/environment中设置您的本地时区。rb文件:
config.time_zone = 'UTC'