我正在使用python库简单日期。我通过使用表示UTC日期的字符串初始化来创建SimpleDate对象。当我尝试使用timedelta添加天数时,它似乎工作正常但是当我尝试打印它时,它无限地递归。我检查了在调试器中添加p而得到的对象,它什么也没显示。类型是SimpleDate但它似乎是空的。如果我不使用UTC字符串,它可以正常工作。
我做错了吗?
我的代码:
from simpledate import SimpleDate
from datetime import timedelta
# This works
day = '2016-06-01 00:00:00'
later = SimpleDate(day) + timedelta(days=10)
print(later)
# This works
day = '2016-06-01 00:00:00'
later = SimpleDate(day) + timedelta(days=10)
print(later)
# The print statement will cause infinite recursion
day = '2016-06-01 00:00:00'
later = SimpleDate(day, tz='UTC') + timedelta(days=10)
print(later)
# The print statement will cause infinite recursion
day = '2016-06-01 00:00:00UTC'
later = SimpleDate(day) + timedelta(days=10)
print(later)
答案 0 :(得分:1)
所以,这里有两个问题。
第一个很容易解释。为某个错误生成消息会导致它尝试报告的错误。这导致生成一条新消息,导致出现新错误,最终耗尽了堆栈。现在已经修复了。
第二个更难解释,因为时区很复杂。因此,我将首先提供一个更容易理解的示例。在PDT(太平洋夏令时)中考虑这个日期:
>>> SimpleDate('2016-08-28', tz='PDT') SimpleDate('2016-08-28')如果我们增加6个月,我们将在冬季中期。 PDT甚至存在然后(它是冬天)!所以我们得到一个错误:
>>> SimpleDate('2016-08-28', tz='PDT') + timedelta(days=180) simpledate.SingleInstantTzError: Attempted to use PDT, defined only for 2016-08-28 07:00:00+00:00
现在你可以争辩说SimpleDate应该足够聪明,知道什么时候PDT结束。但它不是(而且它只是没有可用的数据,但我可能是错的)。相反,SimpleDate 拒绝修改与可能有效性有限的时区相关联的日期。这就是“单一瞬间”的意思。
有关详情,请参阅the documentation。
但在这种情况下,时区是UTC!我们知道这总是有效的。所以我添加了一个特殊情况,在解析UTC时避免了这个限制:
>>> SimpleDate('2016-08-28', tz='UTC') + timedelta(days=180) SimpleDate('2017-02-24', tz='UTC')
现在在PyPI中发布0.5.0版本。抱歉延迟 - 一些测试失败了,我发现了一个新的bug,所以我需要做一些额外的工作。