我正在尝试计算符合一些简单规则的下一个时间点。
仅包括列表中提到的工作日(在下面的示例中,周一至周五)。仅返回列出的小时数(12:00,18:00)。
我想从提供的After
日期开始,得到第一个这样的观点。
我已经达到了这个目标,但它正在返回一个“未接地”的时间,这似乎是与当前时间的不变偏差
def NextRunTime(After=django.utils.timezone.now()):
Sched = {'Hours': [12,18], 'Days': [0,1,2,3,4]}
rule = DateRule.rrule(DateRule.HOURLY,
byweekday=Sched['Days'],
byhour=Sched['Hours'],
dtstart=After,
count=1)
return rule[0]
目前正在返回2013-05-01 18:53:39+01
,这似乎与当前时间相关。
有人可以告诉我如何使用rrule来使用相对于午夜的时间但是在After
之后返回日期吗?
所需输出的明确示例
After Output
Mon 10:11:12 Mon 12:00:00
Mon 11:22:33 Mon 12:00:00
Mon 12:00:01 Mon 18:00:00
Fri 12:00:01 Fri 18:00:00
Fri 18:00:01 Mon 12:00:00 (Following Monday)
答案 0 :(得分:1)
你应该使用dtstart
,分钟= 0和秒= 0,或者自己从返回值中砍掉时间。
因为这是预期rrule
工作的方式 - 它会为传递的dtstart
添加一些间隔,在您的情况下包括分钟和秒。
答案 1 :(得分:1)
我认为您正在寻找bysetpos = 1。此参数使rrule
返回在一组匹配中位于“位置1”的日期时间。 “位置1”相对于byweekday
,byhour
,byminute
,bysecond
等。因此,设置byminute=0
和bysecond=0
, bysetpos=1
,rrule
始终返回小时12或小时18:
import dateutil.rrule as DateRule
import datetime as DT
def NextRunTime(After):
Sched = {'Hours': [12,18], 'Days': [0,1,2,3,4]}
rule = DateRule.rrule(DateRule.HOURLY,
byweekday=Sched['Days'],
byhour=Sched['Hours'],
byminute=0,
bysecond=0,
bysetpos=1,
# dtstart=After means rule might return After
dtstart=After,
# To ensure NextRunTime returns something after After, use
# dtstart=After+DT.timedelta(seconds=1),
count=1)
return rule[0]
tests = [
(DT.datetime(2013,4,29,10,11,12),
DT.datetime(2013,4,29,12,0,0)),
(DT.datetime(2013,4,29,11,22,33),
DT.datetime(2013,4,29,12,0,0)),
(DT.datetime(2013,4,29,12,0,1),
DT.datetime(2013,4,29,18,0,0)),
(DT.datetime(2013,5,3,12,0,1),
DT.datetime(2013,5,3,18,0,0)),
(DT.datetime(2013,5,3,18,0,1),
DT.datetime(2013,5,6,12,0,0)),
(DT.datetime(2013,4,29,12,0,0), # Note that NextRunTime(After) returns After
DT.datetime(2013,4,29,12,0,0)),
]
for After, answer in tests:
result = NextRunTime(After)
try:
assert result == answer
except AssertionError:
print('''\
result:
{result}
answer:
{answer}
'''.format(**locals()))
raise