使用pip上可用的最新dateutil,在使用定期String[] names =new String[0];
套件调用count
方法时,我会遇到奇怪的时间和依赖于顺序的行为。
DAILY
答案 0 :(得分:1)
答案很简单,因为你在创建规则集时没有包含dtstart
参数,当没有包含它时,它默认为datetime.datetime.now()
,这是当前时间,它包含组件达到目前的微秒。
因此,当您首次使用 -
创建规则集时>>> rules = rrule.rruleset()
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
8179
您从当前时间开始输入条目,最高可达微秒。
过了一段时间,当你再次尝试 -
rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
您将再次创建一个rrule.rrule
对象,从当前时间开始,因此它与您在rules
中创建的上一个对象不同。
要解决此问题,您可以指定dtstart
属性以确保它同时启动。
示例 -
>>> rules = rrule.rruleset()
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0), dtstart=datetime.datetime(now.year,now.month,now.day,0,0,0)))
>>> rules.count()
8179
>>> rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0), dtstart=datetime.datetime(now.year,now.month,now.day,0,0,0)))
>>> l3 = list(rules)
>>> len(l3)
0
>>> rules.count()
0
在其他示例中也会出现类似的问题。
鉴于上述情况,我认为dateutil代码中存在一个问题,即当您第一次调用count()
时,它们实际上会缓存规则集的计数(长度),然后只有在重新计算时才会重新计算其正确长度你迭代它等等。
问题出现在rrulebase
类中,它是ruleset
的基类。该代码是(来源 - https://github.com/dateutil/dateutil/blob/master/dateutil/rrule.py) -
def count(self):
""" Returns the number of recurrences in this set. It will have go
trough the whole recurrence, if this hasn't been done before. """
if self._len is None:
for x in self:
pass
return self._len
因此,即使在您之前调用exrule()
后应用.count()
,它也会继续给予相同的计数。
我不是百分之百确定它是否是一个错误,或者它是否有意这样的行为,很可能是一个错误。
我为此开了issue。