Ten rodzaj problemu jest takim polem minowym przypadków brzegowych, że zawsze delegowałbym logikę do czegoś takiego jak IceCube (https://github.com/seejohnrun/ice_cube ). Jest stworzony do radzenia sobie z tego rodzaju powtarzającymi się harmonogramami i zawiera łatwą obsługę serializacji itp. Nawet jeśli wymaga to trochę ponownego przemyślenia tego, jak robisz rzeczy, zdecydowanie polecam go używać.