Почему 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()
в той же конструкции (сегодня 6 сентября 2017 года, дата в тестах выше):
>>> 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
Почему результат 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]>, ...
2 ответа
Ваш диапазон строится в настоящее время с помощью 'day'
как ваш диапазон frame
параметр так, если ваш запрос не удастся приземлиться ровно в полночь, проверяя его диапазон будет возвращать False
,
В самой Arrow, самый простой вариант, вероятно, использовать 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() класса Arrow: он ограничивает ваш объект Arrow и необходим, потому что (как упоминалось в @excaza) диапазон дает вам дневные объекты в полночь.
Я использовал метод utcnow () вместо метода now (), потому что использование arrow.get() создает даты utc.