Python 为什么arrow.now()不在包含今日';情人节?
我正在测试在Python 为什么arrow.now()不在包含今日';情人节?,python,python-3.x,arrow-python,python-arrow,Python,Python 3.x,Arrow Python,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.A
箭头中检查日期是否在日期范围内的能力:
>>> 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.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提到的)范围在午夜为您提供day对象
我使用utcnow()方法而不是now()方法,因为您的arrow.get()用法会创建utc日期 当前构建范围的方式是使用'day'
作为范围的帧
参数,因此,除非您的查询能够准确地在午夜到达,否则检查它范围将返回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()的比较是正确的。我个人尝试用UTC或epoch时间做任何事情,而不是跟踪时区
或者,您可以执行简单的逻辑检查,查看当前时间是否在范围最小值之后和范围最大值之前:
>> 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
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()
,除非您恰好在午夜调用它。选项包括:更改范围的构造方式、下限/上限查询日期或使用时间增量执行某些操作。@excaza:好的,我理解,谢谢。它将查找确切的文字日期(午夜)和。now()
有正确的日期/周一/年,但没有时间。你介意把你的评论变成一个答案吗?这样我就可以接受了。我建议你用纪元时间来检查日期范围@excaza完全正确,他正要写同样的东西
>> 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
>> 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