Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在未来,但相对于今天上午_Python_Rrule_Python Dateutil - Fatal编程技术网

Python 在未来,但相对于今天上午

Python 在未来,但相对于今天上午,python,rrule,python-dateutil,Python,Rrule,Python Dateutil,我试图计算下一个符合一些简单规则的时间点 仅包括列表中提到的工作日(在下面的示例中为周一至周五)。仅返回列出的小时数(12:00、18:00) 我想得到第一个这样的点,从提供的日期之后的开始 我已经知道了,但是它返回了一个“未舍入”的时间,它似乎是一个恒定的偏移量 def NextRunTime(After=django.utils.timezone.now()): Sched = {'Hours': [12,18], 'Days': [0,1,2,3,4]} rule = Da

我试图计算下一个符合一些简单规则的时间点

仅包括列表中提到的工作日(在下面的示例中为周一至周五)。仅返回列出的小时数(12:00、18:00)

我想得到第一个这样的点,从提供的日期之后的
开始

我已经知道了,但是它返回了一个“未舍入”的时间,它似乎是一个恒定的偏移量

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           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)

您应该使用
dtstart
,分钟=0,秒=0,或者自己从返回值中删除时间


因为这就是预期的
rrule
工作方式-它为传递的
dtstart
增加了一些时间间隔,在您的情况下,它包括分钟和秒。

我想您正在寻找。此参数导致
rrule
返回一组匹配中位于“位置1”的日期时间。“位置1”相对于工作日、小时、分钟、秒等。因此,通过设置秒、秒总是返回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

您能给出一些所需输出的示例(给定
之后的
的显式值)吗?@unutbu Done-希望更清楚?我不能从
dtstart
中删除分/秒,因为这可能会导致过去的“命中”。将它们从输出中剥离是一个选项,因为您可以在将来以
dtstart