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

Why is arrow.now() not in a range containing today's day?

我正在 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]>, ...

这应该能满足您的需求:

>>> 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() 方法中 class:这限制了您的 Arrow 对象并且是必需的,因为(如@excaza 所述)范围在午夜给你白天的东西。

我使用了 utcnow() 方法而不是 now() 方法,因为你的 arrow.get() 用法创建 utc 日期。

当前构建范围的方式是使用 'day' 作为范围的 frame 参数,因此,除非您的查询恰好在午夜到达,否则检查范围将return False.

在 Arrow 本身中,最简单的选择可能是使用 floor() or 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