我正在测试arrow
中的能力,以检查日期是否在一个日期范围内:
>>> arrow.get('06/09/2017', 'DD/MM/YYYY') in arrow.Arrow.range('day', arrow.get('06/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'))
True
>>> arrow.get('06/09/2017', 'DD/MM/YYYY') in arrow.Arrow.range('day', arrow.get('07/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'))
False
到目前为止一切都很好。然后,我尝试在同一结构中使用.now()
(今天是2017年9月6日,上述测试日期):
>>> arrow.now()
<Arrow [2017-09-06T21:09:02.402790+02:00]>
>>> arrow.now() in arrow.Arrow.range('day', arrow.get('06/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'))
False
为什么尽管.now()
处于范围内?
False
>>> arrow.Arrow.range('day', arrow.get('06/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'))
[<Arrow [2017-09-06T00:00:00+00:00]>, <Arrow [2017-09-07T00:00:00+00:00]>, ...
当前范围的构建方式是将'day'
用作您的范围的frame
参数,除非您的查询设法在午夜恰好降落,否则检查范围将返回False
。
在箭头本身中,最简单的选项可能是使用 floor()
或 ceiling()
将查询标准化为构建范围的方式:
>> myrange = arrow.Arrow.range('day', arrow.get('06/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'), tz='local')
>> arrow.now().floor('day') in myrange
True
请注意,我将tz
参数更改为'local'
,因此与arrow.now()
的比较是正确的。我个人尝试使用UTC或时期时间来完成所有操作,而不是跟踪时区。
另外,您可以进行简单的逻辑检查以查看当前时间是否比范围的最小值和范围的最大值之前:
:>> myrange = arrow.Arrow.range('day', arrow.get('06/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'), tz='local')
>> myrange[0] <= arrow.now() <= myrange[-1]
True
这应该给您想要的东西:
>>> arrow.utcnow().floor('day') in arrow.Arrow.range('day', arrow.get('05/09/2017', 'DD/MM/YYYY'), arrow.get('06/07/2018', 'DD/MM/YYYY'))
True
密钥在箭头类的 floor()方法中:这限制了您的箭头对象,并且是因为(如@excaza所述)范围在午夜为您提供了一天的对象。
我使用了 utcnow()方法,而不是 now()方法,因为您的 arrow.get()用法会创建UTC日期。