如何在查询期间将时间转换为本地时区的日期



我们有一个非常简单的支付模型,默认为"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'

相关内容

  • 没有找到相关文章

最新更新