Date.today не соответствует фактической дате

Я заметил очень странную проблему в своих журналах относительно текущего времени при использовании метода 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


person tomor    schedule 02.02.2016    source источник
comment
Вы пробовали Time.zone.today? Это похоже на проблему часового пояса для меня.   -  person Leonel Galán    schedule 02.02.2016
comment
Если это действительно проблема с часовым поясом, то почему мы не видим такого поведения постоянно?   -  person tomor    schedule 03.02.2016
comment
Что ж, если смещение вашего часового пояса равно -5 (от UTC), у вас все будет хорошо, пока вы находитесь между полуночью и 7 вечера, потому что сегодня будет соответствовать.   -  person Leonel Galán    schedule 03.02.2016
comment
@Leito для удобства чтения Date.current выполняет это для вас с проверкой, установлены ли Time.zone или config.time_zone.   -  person engineersmnky    schedule 03.02.2016


Ответы (2)


Убедитесь, что в вашем файле config/application.rb для вашего часового пояса установлен фактический часовой пояс, в котором вы тестируете:

Для PST мы используем:

config.time_zone = 'Pacific Time (US & Canada)'

Чтобы получить список строк часового пояса, используемых рельсами, выполните следующую команду:

rake time:zones:all

Вы также можете указать более конкретную локаль. Для США:

rake time:zones:us

person Jake Kaad    schedule 02.02.2016
comment
Часовой пояс установлен правильно, и, как я сказал в предыдущем комментарии, если бы это была проблема с часовым поясом, поведение было бы постоянным (это означает, что каждый раз в полночь мы видели бы несоответствие). При этом из 23 раз 4 раза мы видим несовпадение дат в ТОЧНО одно и то же время. - person tomor; 03.02.2016
comment
Ok. Вы можете попробовать использовать <= Date.today.end_of_day. Если вы используете что-то вроде 1.month.from_now, чтобы установить конец подписки, это будет ровно час через 1 месяц. - person Jake Kaad; 03.02.2016

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

person John Damm Sørensen    schedule 02.02.2016