У меня есть приложение Rails 3, как избежать перекрытия из-за перехода на летнее время?
Моя проблема в том, что у меня есть форма для создания отчетов. Проверяя несоответствие, я заметил, что несколько транзакций появляются на неделе, заканчивающейся 11 марта, также появляются на неделе, начинающейся 12 марта.
Проблема сводится к примерно такому ...
Time.zone.parse('2018-03-11').to_datetime.end_of_day.utc
=> Mon, 12 Mar 2018 07:59:59 +0000
Time.zone.parse('2018-03-12').to_datetime.beginning_of_day.utc
=> Mon, 12 Mar 2018 07:00:00 +0000
Кажется, что моя проблема заключается в 1-часовом перекрытии выше. При проверке диапазонов дат (см. Фактический код ниже), как я могу избежать этого совпадения.
Вот собственно код, напоминающий фильтрацию по дате.
scope :filter_date, lambda { |starts, ends, date, transaction_type = :transaction|
_scope = scoped
starts = Time.zone.parse(starts).to_datetime if starts.class == String and starts.present?
ends = Time.zone.parse(ends).to_datetime.tomorrow if ends.class == String and ends.present?
begin
case date
when 'settled'
transaction_type == "batch" ? date_field = 'deposited_at' : date_field = 'settled_at'
_scope = _scope.order('transactions.'+date_field+' DESC')
_scope = _scope.where("transactions."+date_field+" >= ?", starts) if starts.present?
_scope = _scope.where("transactions."+date_field+" < ?", ends) if ends.present?
else # created, nil, other
_scope = _scope.order('transactions.created_at DESC')
_scope = _scope.where("transactions.created_at >= ?", starts) if starts.present?
_scope = _scope.where("transactions.created_at < ?", ends) if ends.present?
end
end
_scope
}
Как мне преодолеть это перекрытие времени, когда действует летнее время?
@AntonTkachov Я не знал, что это было так, пока ребята из аккаунтов не подняли флаг, что еженедельные отчеты имеют несоответствие с созданными отчетами. Подведенные итоги еженедельных отчетов были дополнены ежемесячными отчетами.
Думаю, имеет смысл обсудить с ними, как они справляются с такими несоответствиями на своей стороне. Опишите им проблему и получите отзывы об их видении возможного решения. Потому что ваш код работает нормально и абсолютно логично. А пока подумаю, как с этим справиться :)
Написал решение. Я надеюсь, ты будешь держать меня в курсе
Мой ответ тебе помог?
Попробуйте это решение. Я думаю, это должно решить вашу проблему:
scope :filter_date, lambda { |starts, ends, date, transaction_type = :transaction|
_scope = scoped
if starts.class == String and starts.present?
starts = Time.zone.parse(starts)
starts += 1.hour if starts.dst?
starts = starts.to_datetime
end
if ends.class == String and ends.present?
ends = Time.zone.parse(ends) + 1.day
ends += 1.hour if ends.dst?
ends = ends.to_datetime
end
begin
case date
when 'settled'
transaction_type == "batch" ? date_field = 'deposited_at' : date_field = 'settled_at'
_scope = _scope.order('transactions.'+date_field+' DESC')
_scope = _scope.where("transactions."+date_field+" >= ?", starts) if starts.present?
_scope = _scope.where("transactions."+date_field+" < ?", ends) if ends.present?
else # created, nil, other
_scope = _scope.order('transactions.created_at DESC')
_scope = _scope.where("transactions.created_at >= ?", starts) if starts.present?
_scope = _scope.where("transactions.created_at < ?", ends) if ends.present?
end
end
_scope
}
@Ziyan Junaideen Это вам помогло?
Как вы думаете, почему вам действительно нужно что-то с этим делать? Имейте в виду, что это не ошибка в вашем коде. Это ошибка самого мира. Если смотреть с концептуальной точки зрения, эта транзакция действительно имела место в течение обеих недель :( Если вы все еще абсолютно уверены, что нам нужно что-то с ней сделать, тогда я предложу какое-нибудь решение