splite date with Ice_Cube in rails
Your problem arises from s_time=(Time.now+start_time).to_i
. It seems that start_time
is an instance of ActiveSupport::TimeWithZone
. You are trying to add Time
and ActiveSupport::TimeWithZone
that is probably not the thing you want to achieve.
schedule.occurrences_between
at least expects two instances of ActiveSupport::TimeWithZone
. Therefore, you could do something like this:
s_time = Time.zone.now
e_time = s_time + 1.month
schedule.occurrences_between(s_time, e_time)
UPD: Actually, you do not need that long conditional with months:
schedule.occurrences_between(start_time, start_time + month.months)
And instead of defining and incrementing number
use #each_with_index
Ruby/ice_cube: Exclude whole day for hourly recurring event
Since there seems to be no other solution and in order to close this question, here’s what I'm using (as described in an update to the original question above already):
schedule = IceCube::Schedule.from_yaml([PERSISTED SCHEDULE])
occurrences = schedule.occurrences_between([START TIME], [END TIME])
exceptions = schedule.exdates.map(&:to_date)
occurrences.reject {|occurrence|
exceptions.include?(occurrence.to_date)
}
splite date with Ice_Cube in rails
Your problem arises from s_time=(Time.now+start_time).to_i
. It seems that start_time
is an instance of ActiveSupport::TimeWithZone
. You are trying to add Time
and ActiveSupport::TimeWithZone
that is probably not the thing you want to achieve.
schedule.occurrences_between
at least expects two instances of ActiveSupport::TimeWithZone
. Therefore, you could do something like this:
s_time = Time.zone.now
e_time = s_time + 1.month
schedule.occurrences_between(s_time, e_time)
UPD: Actually, you do not need that long conditional with months:
schedule.occurrences_between(start_time, start_time + month.months)
And instead of defining and incrementing number
use #each_with_index
Monthly schedule that catches ends of the month
This passes all my specs, but is fugly and probably breaks for schedules longer than a year (which I don't care about yet).
class LeasePaymentSchedule
def self.monthly(a bunch of args)
case start_day
when 31
schedule = IceCube::Schedule.new(start, scheduler_options) do |s|
s.add_recurrence_rule IceCube::Rule.monthly.day_of_month(-1).until(end_time)
end
when 30,29
schedule = IceCube::Schedule.new(start, scheduler_options) do |s|
s.add_recurrence_rule IceCube::Rule.monthly.day_of_month(start_day).until(end_time)
end
schedule.all_occurrences.each do |o|
next unless [1,3,6,8,10].include? o.month
missed = (o + 1.month).yday
# Probably breaks for durations longer than 1 year
schedule.add_recurrence_rule IceCube::Rule.yearly.day_of_year(missed).count(1)
end
else
schedule = IceCube::Schedule.new(start, scheduler_options) do |s|
s.add_recurrence_rule IceCube::Rule.monthly.day_of_month(start_day).until(end_time)
end
end
schedule
end
end
So many specs:
Finished in 4.17 seconds
390 examples, 0 failures
-
shared_examples_for :a_schedule do
it 'returns an IceCube Schedule' do
schedule.should be_a IceCube::Schedule
end
it 'should start on the correct day' do
schedule.start_time.should eq expected_start
end
it 'has the right number of occurrences' do
schedule.all_occurrences.size.should eq expected_occurrences
end
end
describe :monthly do
let(:expected_occurrences) { 12 }
let(:expected_start) { date.next_month.beginning_of_day }
let(:schedule) { LeasePaymentSchedule.monthly }
before do
Date.stub(:today).and_return(date)
end
shared_examples_for :on_the_28th do
let(:date) { Time.parse "#{year}-#{month}-28" }
it_behaves_like :a_schedule
end
shared_examples_for :on_the_29th do
let(:date) { Time.parse "#{year}-#{month}-29" }
it_behaves_like :on_the_28th
it_behaves_like :a_schedule
end
shared_examples_for :on_the_30th do
let(:date) { Time.parse "#{year}-#{month}-30" }
it_behaves_like :on_the_29th
it_behaves_like :a_schedule
end
shared_examples_for :on_the_31st do
let(:date) { Time.parse "#{year}-#{month}-31" }
it_behaves_like :on_the_30th
it_behaves_like :a_schedule
end
shared_examples_for :the_whole_year do
context :february do
let(:month) { 2 }
it_behaves_like :on_the_28th
end
[ 4, 7, 9, 11 ].each do |month_num|
let(:month) { month_num }
it_behaves_like :on_the_30th
end
[ 1, 3, 5, 6, 8, 10, 12].each do |month_num|
let(:month) { month_num }
it_behaves_like :on_the_31st
end
end
context :a_leap_year do
let(:year) { 2012 }
context :february_29th do
let(:month) { 2 }
it_behaves_like :on_the_29th
end
it_behaves_like :the_whole_year
end
context :before_a_leap_year do
let(:year) { 2011 }
it_behaves_like :the_whole_year
end
context :nowhere_near_a_leap_year do
let(:year) { 2010 }
it_behaves_like :the_whole_year
end
end
Related Topics
Setting Environment Variables with Puppet
When and Where Do I Require Files in a Rails Application
Automatically Precompile Assets Before Pushing to Heroku
In a Sinatra App on Heroku, Session Is Not Shared Across Dynos
Initializing Instance Variables in Mixins
Ruby - Create Singleton with Parameters
Raise Exception When Accessing Attributes That Doesn't Exist in Openstruct
Split String Without Removing Delimiter
How to Pluck Email from Array of Users
Bash: /Home/Xxx/.Rvm/Scripts/Rvm: No Such File or Directory
Elasticsearch Terms Aggregation by Entire Field
Cheat Sheet for All Design Patterns Implemented in Ruby
Warning: String Literal in Condition