为什么arrow.now()不在包含今天一天的范围内?



我正在测试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日期。

相关内容

  • 没有找到相关文章