Как я могу проверить, находится ли данный объект datetime «между» двумя datetime? - PullRequest
7 голосов
/ 14 апреля 2010
my_event = Event.objects.get(id=4)
current_time = datetime.datetime.now()

Как я могу проверить, находится ли мое текущее время между ними?

my_event.start_time < current_time < my_event.end_time

Ответы [ 4 ]

7 голосов
/ 14 апреля 2010

Ваш ответ - путь, пока start_time и end_time не имеют ассоциированного класса tzinfo. Вы не можете напрямую сравнивать наивное время даты с timezoned-datetime.

3 голосов
/ 14 апреля 2010

Вы можете использовать простое сравнение трех дат, например:

if date1 < yourdate < date2:
  ...do something...
else:
  ...do ...
1 голос
/ 11 мая 2015

Я знаю старое, но поскольку это так высоко в результатах Google, ответы здесь не учитывают два случая:

  1. Если ваше время равняется одному из ваших диапазонов, то есть ваш диапазон составляет 6-8, а он равен 6.
  2. Если ваш временной диапазон, скажем, от 18:00 до 6:00, допустимый диапазон; однако 19:00 не будет соответствовать.

Я написал функцию для сравнения времени, надеюсь, это поможет любому, кто просматривает этот старый вопрос.

def process_time(intime, start, end):
    if start <= intime <= end:
        return True
    elif start > end:
        end_day = time(hour=23, minute=59, second=59, microsecond=999999)
        if start <= intime <= end_day:
            return True
        elif intime <= end:
            return True
    return False
0 голосов
/ 23 ноября 2017

Дата и время тестирования должны быть наивными (без часового пояса) или всеми осведомленными (часовой пояс) Исключение должно произойти, если вы попытаетесь сравнить осознанное и наивное. Если все даты известны, часовые пояса не обязательно должны совпадать, что, по-видимому, учитывается при сравнении.

например.

class RND(datetime.tzinfo):
    """ Random timezone UTC -3 """

    def utcoffset(self, dt):
        return datetime.timedelta(hours=-3)

    def tzname(self, dt):
        return "RND"

    def dst(self, dt):
        return datetime.timedelta(hours=0)


april_fools = datetime.datetime(year=2017, month=4, day=1, hour=12, tzinfo=pytz.UTC)

random_dt = datetime.datetime(year=2017, month=4, day=1, hour=9, tzinfo=RND())

random_dt == april_fools
# True as the same time when converted back to utc.

# Between test of 3 naive datetimes
start_spring = datetime.datetime(year=2018, month=3, day=20)
end_spring = datetime.datetime(year=2018, month=6, day=21)
april_fools = datetime.datetime(year=2018, month=4, day=1)


if start_spring < april_fools < end_spring:
    print "April fools is in spring"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...