Вы можете передать объект времени в область вместо даты, чтобы он был более точным. При этом вы должны помнить о часовых поясах:
Time.zone = "Eastern Time (US & Canada)"
start_time = Time.zone.parse("#{Date.today} 23:59:00")
end_time = Time.zone.parse("#{Date.yesterday} 00:00:00")
@audits = Audit.after(start_time)).before(end_time).not_canceled.find_all_by_user_id(params[:id])
и области должны быть изменены следующим образом
named_scope :after, lambda {|time| {:conditions => ["date_time > ?", time]}}
named_scope :before, lambda {|time| {:conditions => ["date_time < ?", time]}}
Ключом здесь является код Time.zone.parse
, который будет анализировать время, предполагая, что данная строка находится в часовом поясе, указанном строкой выше. Если вместо этого мы будем использовать Time.parse
напрямую, в качестве часового пояса будет использоваться часовой пояс машины сервера.
Здесь Date.today
также рискованно, так как дает дату в часовом поясе компьютера сервера. Существует два вспомогательных метода, добавленных Rails к объекту времени как beginning_of_day
и end_of_day
, которые будут давать правильное время. Итак, используя их, мы можем вычислить
start_time = Time.zone.now.end_of_day - 1.day
end_time = Time.zone.now.beginning_of_day + 1.day
Если в config/environment.rb
вы уже определили,
config.time_zone = 'Eastern Time (US & Canada)'
или требуемый часовой пояс, вам не нужно указывать первую строку в коде (Time.zone = "Eastern Time (US & Canada)"
). Для получения часовых поясов в США вы можете использовать rake time:zones:us
. (Для всех часовых поясов это rake time:zones:all
)