为什么是箭头。现在()不在包含今天的范围内?

2024-04-27 01:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试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日,上面测试的日期):

^{pr2}$

为什么结果False尽管.now()在范围内?

>>> 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]>, ...

Tags: infalsetruegetrange能力结构now
2条回答

这会给你想要的:

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

关键在Arrow类的floor()方法中:这限制了Arrow对象,这是必需的,因为(正如@excaza所提到的)range为您提供了午夜的day对象。在

我使用了utcnow()方法而不是now()方法,因为您的箭头。获取()使用创建utc日期。在

当前构造范围的方式是使用'day'作为range的frame参数,因此,除非您的查询能够在午夜准确着陆,否则检查范围将返回False。在

在Arrow本身中,最简单的选择可能是使用^{}^{}将查询规范化为如何构造范围:

>> 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()的比较是正确的。我个人不想用时区来记录时间。在

或者,您可以进行简单的逻辑检查,以查看当前时间是否在范围的最小值之后,而在范围的最大值之前:

^{pr2}$

相关问题 更多 >