Я заметил очень странную проблему в своих журналах относительно текущего времени при использовании метода Date.today
. По сути, у меня есть задание cron (использующее часовой механизм), которое запускается каждую ночь в 00:00, чтобы проверить, какие подписки подлежат оплате, чтобы попытаться автоматически их обновить. Задание выполняет метод, который, в свою очередь, выполняет запрос следующим образом:
where("date(active_until) <= ?", Date.today)
В большинстве случаев это выполняется правильно. Однако, судя по моим наблюдениям в журнале, бывают случаи, когда Date.today
не соответствует фактической дате. Вытащил из моих логов:
Примечание. Даты указаны в будущем, потому что я вручную устанавливал время, чтобы проверить, правильно ли это выполняется.
D, [2016-05-01T00:00:00.015901 #21699] DEBUG -- : Subscription Load (2.6ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-04-30'
D, [2016-05-02T00:00:00.011130 #21721] DEBUG -- : Subscription Load (2.2ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-05-02'
Если вы посмотрите на первый случай, вы увидите, что оператор был выполнен в 2016-05-01T00:00:00.015901
, а Date.today произвел 2016-04-30
. Второй случай, очевидно, правильный, поскольку дата журнала соответствует Date.today.
Самая большая проблема в том, что я не могу воспроизвести его. Единственное, что я вижу из своих журналов, это то, что это произошло 3 из 24 раз. Какие тут могут быть проблемы? Возможно ли, что Rails каким-то образом кэширует входные параметры запроса?
Моя версия Ruby: ruby 2.2.1p85 (версия 2015-02-26 49769) [x86_64-linux]
Моя версия Rails: 4.2.1
Time.zone.today
? Это похоже на проблему часового пояса для меня. - person Leonel Galán   schedule 02.02.2016Date.current
выполняет это для вас с проверкой, установлены лиTime.zone
илиconfig.time_zone
. - person engineersmnky   schedule 03.02.2016