我有这个神奇的咒语,我使用(并理解)以一个十五分钟的间隔填充一天中所有时间的时间字段。
['%s:%s%s' % (h, m, ap) for ap in ('am', 'pm') for h in ([12] + range(1,12)) for m in ('00', '15','30','45')]
这会打印出一个列表:
['12:00am', '12:15am', '12:30am', '12:45am', '1:00am',...
我正在尝试调整该代码,以便它适用于开始时间和结束时间。例如,我希望它从早上9点开始,到晚上5点结束。
当时间从数据库返回时,它是time
对象:datetime.time(18, 0)
我尝试做的是取hour
的{{1}}并在那里开始射程。但我的思绪因上午和下午调整它的想法而受到了打击。
如何调整代码以使用开始和结束时间?
答案 0 :(得分:3)
你可以这样做。编写自己的生成器,其作用类似于range
,并将时间对象(如果我理解正确,则来自您的数据库)作为开始和停止(仅限于):
#! /usr/bin/python3
import datetime
def timerange(start, stop, step = datetime.timedelta(minutes = 15)):
t = datetime.datetime(2000, 1, 1, start.hour, start.minute)
stop = datetime.datetime(2000, 1, 1 if start <= stop else 2, stop.hour, stop.minute)
while t < stop:
yield t.time()
t += step
现在你可以像这样使用它并产生时间对象:
nineam = datetime.time(9, 0) #from DB
fivepm = datetime.time(17, 0) #from DB
for t in timerange(nineam, fivepm):
print(t)
如果您想要格式化,请编写另一个根据您的需要返回字符串的生成器:
def ftimerange(start, stop, step = datetime.timedelta(minutes = 15)):
for t in timerange(start, stop, step):
yield t.strftime('%I:%M%p')
for s in ftimerange(nineam, fivepm):
print(s)
如果在午夜之前开始并在之后停止,这也有效。
这是一份工作样本:
>>> elevenpm = datetime.time(23, 0)
>>> oneam = datetime.time(1, 0)
>>> for s in ftimerange(elevenpm, oneam): print(s)
...
11:00PM
11:15PM
11:30PM
11:45PM
12:00AM
12:15AM
12:30AM
12:45AM
或者使用秒范围中的另一个步骤:
>>> start = datetime.time(8, 5)
>>> stop = datetime.time(9, 12)
>>> step = datetime.timedelta(minutes = 3, seconds = 22)
>>> for s in ftimerange(start, stop, step): print(s)
...
08:05AM
08:08AM
08:11AM
08:15AM
08:18AM
08:21AM
08:25AM
08:28AM
08:31AM
08:35AM
08:38AM
08:42AM
08:45AM
08:48AM
08:52AM
08:55AM
08:58AM
09:02AM
09:05AM
09:08AM
答案 1 :(得分:0)
您可以针对特定范围调整h
:
['%s:%s%s' % (h, m, ap) for ap in ('am', 'pm') for h in ([9] + range(1,5)) for m in ('00', '15','30','45')]
然而,由于范围不包括最后一次,因此不会产生5.00pm。