为什么 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
我正在 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