我正在尝试使用以下方式查找今天(按当前时区)创建的“条目”:
Entry.where("DATE(created_at) = DATE(?) AND email = ?", Time.now, email)
Time.now
返回的是当前时区的时间,但是查询似乎在搜索每个条目的created_at
列的UTC时间。
有什么办法可以在服务器时区中找到今天创建的条目吗?
我正在尝试使用以下方式查找今天(按当前时区)创建的“条目”:
Entry.where("DATE(created_at) = DATE(?) AND email = ?", Time.now, email)
Time.now
返回的是当前时区的时间,但是查询似乎在搜索每个条目的created_at
列的UTC时间。
有什么办法可以在服务器时区中找到今天创建的条目吗?
在调用 SQL 中的 DATE()
函数后,时区信息就会丢失。需要牢记以下两点:
DATE()
的结果。可以使用以下代码:
now = Time.now
Entry.where('created_at between :start and :end and email = :email',
:start => now.beginning_of_day,
:end => now.end_of_day,
:email => email
)
时间应该自动转换为UTC。您可能希望稍微不同地处理上限; 使用end_of_day
会给您23:59:59
,因此有一点空间可以让您捕获想要捕获的内容。您可以通过使用显式半开区间(而不是SQL的between
使用的闭区间)来解决这个问题,如下所示:
now = Time.now
Entry.where('created_at >= :start and created_at < :end and email = :email',
:start => now.beginning_of_day,
:end => now.tomorrow.beginning_of_day,
:email => email
)
使用{{link1:Time.now.utc
}}吗?
使用 Time.zone.now
。这将使用一个 ActiveSupport::TimeWithZone
对象,在数据库搜索中使用时会自动转换为 UTC。
America/Los_Angeles
查找时区偏移量:
Time.now.in_time_zone(current_time_zone).utc_offset / 3600) * -1
在控制器中:7
start_date_format = DateTime.strptime(@start_date, date_format)
start_date_format_with_hour =
DateTime.strptime((start_date_format.to_i + timezone_offset*60*60).to_s,'%s').strftime(date_format)
end_date_format = DateTime.strptime(@end_date, date_format)
end_date_format_with_hour = DateTime.strptime((end_date_format.to_i + timezone_offset*60*60).to_s,'%s').strftime(date_format)
@filters_date = "invoices.created_at >= ? AND invoices.created_at < ?", start_date_format_with_hour, end_date_format_with_hour