Вы говорите об интервалах.
Лучший способ иметь интервал - это время начала и продолжительность.
class Shift( object ):
def __init__( self, start, length ):
self.start= start
self.length= length
def __repr__( self ):
return "Shift(%d,%d)" % ( self.start, self.length )
def ends( self ):
return self.start + self.length
Вы можете сериализовать эти объекты.
[ Shift(9,6), Shift(76,2), Shift(298,6) ]
Вы можете реализовать операторы для сравнения смен, чтобы увидеть, перекрываются ли они или один содержит другой.
Почему длина? Почему бы не закончить время?
Оказывается, что некоторые математические приемы обнаружения перекрытий и сдерживания кажутся немного более простыми, если вы считаете, что интервалы начинаются в определенное время и выполняются в течение заданного времени. Я обнаружил, что немного легче доказать, что между сдвигами, сделанными таким образом, нет пробелов.
Вы хотите использовать "полуоткрытый" интервал. Время начала включено в смену, но время окончания не включено.
def contains( self, aTime ):
return self.start <= aTime < self.start + self.length
def before( self, nextShift ):
return self.start + self.length == nextShift.start
def after( self, prevShift ):
return prevShift.ends() == self.start
Чтобы преобразовать в дату и время, вам нужна базовая дата для начала недели. Затем вы можете сделать некоторые математические расчеты, чтобы определить время начала смены. Длина - это (тривиально) интервал.
def startDatetime( self, week_start_datetime ):
offset= datetime.timedelta( seconds= self.start*30*60 )
return week_start_datetime + offset
def lengthTimedelta( self ):
return datetime.timedelta( seconds= self.length*30*60 )
def endDatetime( self, week_start_datetime ):
return self.startDatetime( week_start_datetime ) + self.lengthTimedelta()