Как получить время 17:00:00 сегодня или вчера?
Если 17:00:00 сегодня уже прошло, то это должна быть сегодняшняя дата, иначе - вчерашняя. Сегодняшнее время я получаю с:
test = datetime.datetime.now().replace(hour=17,minute=0,second=0,microsecond=0)
Но я не хочу иметь будущее время. Как я могу это исправить?
4 ответа
Вы можете проверить, если текущее время меньше 17:00, если это так, вычесть один день из сгенерированного объекта времени:
test = datetime.datetime.now().replace(hour=17,minute=0,second=0,microsecond=0)
if datetime.datetime.now() < test:
test = test - datetime.timedelta(days=1)
Лучше использовать datetime.time
сегодня непосредственно для сравнения времени. Тогда используйте datetime.timedelta
сделать математику:
if datetime.datetime.now().time() > datetime.time(17,0):
# today, as it's after 17 o'clock
test = datetime.date.today()
else:
# yesterday, as it's before 17 o'clock
test = datetime.date.today() - datetime.timedelta(days=1)
Установить тест как сегодня или вчера в зависимости от времени суток:
from datetime import datetime, date, timedelta
if datetime.now().strftime('%H:%M') > '17:00':
test = date.today()
else:
test = date.today() - timedelta(days=1)
Функции даты и времени Pythons действительно иногда довольно неудобны. Пока вы можете использовать datetime.timedelta
объекты для вашего случая, чтобы вычесть время в днях, например, пересчет месяца или года становится раздражающим. Так что, если вы рано или поздно не только захотите добавить один день, возможно, попробуйте эту функцию:
import datetime
import calendar
def upcount(dt, years=0, months=0, **kwargs):
"""
Python provides no consistent function to add time intervals
with years, months, days, minutes and seconds. Usage example:
upcount(dt, years=1, months=2, days=3, hours=4)
"""
if months:
total_months = dt.month + months
month_years, months = divmod(total_months, 12)
if months == 0:
month_years -= 1
months = 12
years += month_years
else:
months = dt.month
years = dt.year + years
try:
dt = dt.replace(year=years, month=months)
except ValueError:
# 31st march -> 31st april gives this error
max_day = calendar.monthrange(years, months)[1]
dt = dt.replace(year=years, month=months, day=max_day)
if kwargs:
dt += datetime.timedelta(**kwargs)
return dt