在Python中调整时间列表的开始和结束范围

时间:2013-12-30 01:53:22

标签: python

我有这个神奇的咒语,我使用(并理解)以一个十五分钟的间隔填充一天中所有时间的时间字段。

['%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}}并在那里开始射程。但我的思绪因上午和下午调整它的想法而受到了打击。

如何调整代码以使用开始和结束时间?

2 个答案:

答案 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。