Почему 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.

Другие вопросы по тегам