Как получить время 17:00:00 сегодня или вчера?

Если 17:00:00 сегодняшнего дня уже прошло, то это должна быть сегодняшняя дата, иначе - вчерашняя. Сегодня я получаю с:

test = datetime.datetime.now().replace(hour=17,minute=0,second=0,microsecond=0)

Но я не хочу иметь будущее время. Как я могу это исправить?


person LA_    schedule 02.10.2012    source источник
comment
сделайте это один вопрос на вопрос, пожалуйста.   -  person moooeeeep    schedule 02.10.2012
comment
@moooeeeep, исправлено - stackoverflow.com/questions/12686991/ как получить последнюю пятницу   -  person LA_    schedule 02.10.2012


Ответы (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)
person andrean    schedule 02.10.2012

Лучше использовать 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)
person moooeeeep    schedule 02.10.2012

установить тест как сегодня или вчера в зависимости от времени суток:

from datetime import datetime, date, timedelta

if datetime.now().strftime('%H:%M') > '17:00':
    test = date.today()
else:
    test = date.today() - timedelta(days=1)
person Marwan Alsabbagh    schedule 02.10.2012

Функции даты и времени Python действительно иногда довольно неудобны. Хотя вы можете использовать объекты 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
person Michael    schedule 02.10.2012