Python, SQLAlchemy: 将营业时间存储为二进制位掩码
我正在用Python编程,并使用SQLAlchemy来存储营业时间。
营业时间分为三个部分:
- 一周的天数,以二进制的方式存储为位掩码
- 营业开始的时间
- 营业结束的时间
位掩码的工作原理是这样的:有7个数字,每个数字是0或1,代表一周中的不同天。每个位置对应一周中的一天。第一个位置代表星期一,最后一个位置代表星期天。例如,1111100表示星期一到星期五,0000111表示星期五到星期六。此外,我把时间存储为军事时间,0600表示早上6点,1800表示晚上6点。
hours = Table('hours', Base.metadata,
Column("id", Integer, primary_key=True),
Column("businessid", Integer, ForeignKey('businesses.id')),
Column("days", Integer),
Column("open", Integer),
Column("close", Integer),
)
class Hours(object):
def __init__(self, days=None, open=None, close=None):
self.days = days
self.open = open
self.close = close
mapper(Hours, hours)
mapper(Business, businesses, properties={
'hours': relationship(Hours, backref='business'),
})
那么,如何用Python的方式来判断两个位掩码表示的星期几是否有重叠?还有,给定两个小时对象,怎么才能知道一家店现在是否开门?
1 个回答
3
关于检查星期几,如果你说的“二进制”是指像'1011011'这样的字符串:
overlap = [n for n in range(7) if (bitmask1[n] == bitmask2[n] == '1')]
这段代码会给你一个数字列表(从0到6),表示重叠的日期——[4]表示星期五有重叠。
overlap = ''.join(('1' if (bitmask1[n] == bitmask2[n] == '1') else '0') for n in range(7))
这段代码会给你一个新的位掩码字符串——'00000100',表示星期五有重叠。
如果你实际上是把这个数字存储为一个整数,最简单的方法就是把它转换成二进制,可以用 bin(bitmask)[2:]
或者 "{0:b}".format(bitmask)
。
我不太明白你说的“当前开放的……两个时间段对象”是什么意思。你是想知道这两个时间段的重叠部分吗?如果它们是整点的话,那就简单了:
[hour for hour in range(firsthour, secondhour) if hour in range(openinghour, closinghour)
这段代码会给你一个包含两个时间段内所有小时的列表。