Сравнение времени с часовыми поясами в рельсах

Я использую Ruby 2.1.2 и Rails 4.1.4.

tl;dr; Я получаю дату и время от пользователя, который заходит в контроллер из формы (через параметры) следующим образом:

pickuptime = params[:appointment][:pickuptime]
(byebug) pickuptime
"01/06/2015 7:26 PM"

и мне нужно убедиться, что это в будущем, чтобы клиенты не могли назначать встречи в прошлом, и у меня есть часовой пояс клиента, хранящийся в базе данных, потому что клиенты могут быть в разных местах.

Подробности:

Я получаю время в своем контроллере через форму:

pickuptime = params[:appointment][:pickuptime]
(byebug) pickuptime
"01/06/2015 7:26 PM"

Затем я преобразовываю его в DateTime, чтобы создать запись о встрече:

pickuptime = DateTime.strptime(pickuptime, "%m/%d/%Y %l:%M %p")
@appointment = @car.appointments.build(garage_id: garage_id, pickuptime: pickuptime)

Моя модель Appointment имеет проверку, которая гарантирует, что вы не сможете создать встречу в прошлом:

def pickuptime_is_in_future
  if pickuptime < Time.current
    errors.add(:pickuptime, "Appointment must be in the future")
  end
end

Я хотел бы учитывать часовой пояс клиента (@car.garage.time_zone), который хранится в базе данных, при построении встречи, например.

pry(main)> Garage.first.time_zone
Garage Load (0.6ms)  SELECT  "garages".* FROM "garages"   ORDER BY "garages"."id" ASC LIMIT 1
=> "Eastern Time (US & Canada)"

Сейчас это не работает. Когда я создаю встречу на 1 минуту в будущем, я получаю следующее:

(byebug) pickuptime
Tue, 06 Jan 2015 19:22:00 UTC +00:00
(byebug) Time.current
Wed, 07 Jan 2015 00:21:53 UTC +00:00

что приводит к сбою проверки, несмотря на то, что встреча была создана в будущем и, следовательно, должна пройти успешно.

Любое руководство о том, как правильно это реализовать, будет высоко оценено!


person jackerman09    schedule 07.01.2015    source источник


Ответы (1)


Используйте in_time_zone.

См. https://www.reinteractive.net/posts/168-dealing-with-timezones-efficiently-in-rails & http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails, где можно найти полезные советы по работе с часовыми поясами в рельсы.

person Prakash Murthy    schedule 07.01.2015