Как сравнить время в Python?

105

Я вижу, что сравнение дат может быть выполнено, и это тоже datetime.timedelta(), но я изо всех сил пытаюсь выяснить, как проверить, является ли текущее время ( datetime.datetime.now()) раньше, позже или таким же, чем указанное время (например, 8 утра), независимо от даты.

Стив Джей
источник
2
Я не уверен, что это будет ответ, но я поместил его здесь в качестве комментария: как ни странно, я обнаружил, что Python принимает сравнения типа '23:23:00' > '23:59:00'или '23:23:00' > '23:09:22', как и между двумя datetime.datetime.now().strftime('%H:%M')значениями. Является ли это лучшим способом сравнения времен? Я не знаю. Это работает? Насколько я тестировал, он работал нормально. Но определенно (и, конечно): нет возможности использовать это со строкой datetime, в которой есть месяц, будние дни.
ivanleoncz

Ответы:

138

Вы не можете сравнивать конкретный момент времени (например, «прямо сейчас») с нефиксированным повторяющимся событием (каждый день бывает 8 утра).

Вы можете проверить, до или после сегодняшнего 8:00:

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

источник
4
Возможно, вы захотите перевернуть принятие на ответ Пэра Висландера (и, как правило, следует подождать еще несколько минут, чем вы: P), поскольку он немного более конкретен для того, что вы просили.
69

Вы можете использовать time()метод datetimeобъектов для получения времени суток, которое можно использовать для сравнения без учета даты:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True
Пэр Вислендер
источник
2
Обязательно сделайте datetime.datetime.now().time(), не забудьте скобки now()!
Хосе Сальватьерра,
10

Вы можете напрямую сравнивать объекты datetime.datetime

Например:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 
Kimvais
источник
5

В духе Роджера Пейта:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"
AndrewR
источник
2

Другой способ сделать это без добавления зависимостей или использования datetime - просто выполнить некоторую математику с атрибутами объекта времени. В нем есть часы, минуты, секунды, миллисекунды и часовой пояс. Для очень простых сравнений должно быть достаточно часов и минут.

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

Я не рекомендую делать это, если у вас нет невероятно простого сценария использования. Для всего, что требует знания часового пояса или информации о датах, вы должны использовать datetime.

Томас Дигнан
источник
2

Удивлен, что не видел здесь этого лайнера:

datetime.datetime.now().hour == 8
Джесси Реза Хорасани
источник
2

Вы можете использовать функцию Timedelta для сравнения увеличения времени x.

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

Просто комбинация этих ответов это И Роджер

Ариан Викаш
источник
1

datetime имеет возможность сравнения

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False
люк
источник