манипулирование временем в python по умолчанию 8 часов - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над проектом python flask, в котором есть таблица именованных запросов, и он получает или добавляет данные в него при отправке нового запроса, текущее время записывается и когда он отредактирован и статус установлен в ожидание, текущее время в это время также записывается в другом столбце я создал поток, который работает в фоновом режиме, чтобы вычесть текущее время из времени начала и в ожидании, чтобы проверить время с момента отправки или ожидания запроса. однако мне нужно изменить его так, чтобы день был с 08:00 до 16:00, вот и все, а если текущее время больше, оно просто сдвигается на следующий день, за исключением четверга, например, два дня:

если запрос находится на рассмотрении во вторник 15:00, а сегодня среда, а сейчас время 08:30, результат вычитания должен составлять только полтора часа, а не 17:30, и убедитесь, что пятница считается выходным я могу попытаться сделать это при многих условиях и добавить 16 часов ко времени, но я считаю, что должно быть более простое решение. это нить с неполным плохим решением

def monitoring_loop():
    while True:
        #if datetime.now().strftime("%H:%M:%S")=="15:59:59" or datetime.now().strftime("%H:%M:#%S")=="12:30:00":
        session = DBSession()  
        UserRequests= session.query(Requests).filter(Requests.Status_Name!="Solved").all()     
        if datetime.now().strftime("%H:%M:%S")>="08:00:00" and datetime.now().strftime("%H:%M:%S")<"15:59:59":
            currentTime=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            print("Saving Changes Normally")
            datetimeFormat = '%Y-%m-%d %H:%M:%S'
            for req in UserRequests:
                if req.Status_Name=="Opened" :
                    c = datetime.strptime(currentTime, datetimeFormat)- datetime.strptime(str(req.Record_Created), datetimeFormat) 
                    req.OpenedToPending =c.total_seconds()/60
                    req.PendingToSolved =0
                    session.add(req)
                elif req.Status_Name=="Pending" :
                    p = datetime.strptime(currentTime, datetimeFormat)- datetime.strptime(str(req.FirstResponseAt), datetimeFormat)
                    req.PendingToSolved =p.total_seconds()/60
                    session.add(req)
        else:
            if datetime.now().strftime("%H:%M:%S")>"16:00:00" and datetime.now().strftime("%H:%M:%S")<="23:59:59":
                currentTime=datetime.strptime(datetime.now(), "%Y-%m-%d 08:00:00")+timedelta(days=1)
                for req in UserRequests:
                    if req.Status_Name=="Opened" :
                        c = datetime.strptime(currentTime, datetimeFormat)- (datetime.strptime(str(req.Record_Created), datetimeFormat)+timedelta(hours=16)) 
                        req.OpenedToPending =c.total_seconds()/60
                        req.PendingToSolved =0
                        session.add(req)
                    elif req.Status_Name=="Pending" :
                        p = datetime.strptime(currentTime, datetimeFormat)- (datetime.strptime(str(req.FirstResponseAt), datetimeFormat)+timedelta(hours=16))
                        req.PendingToSolved =p.total_seconds()/60
                        session.add(req)
            elif datetime.now().strftime("%H:%M:%S")>"00:00:00" and datetime.now().strftime("%H:%M:%S")<"08:00:00":
                currentTime=datetime.strptime(datetime.now(), "%Y-%m-%d 08:00:00")
                for req in UserRequests:
                    if req.Status_Name=="Opened" :
                        c = datetime.strptime(currentTime, datetimeFormat)- (datetime.strptime(str(req.Record_Created), datetimeFormat)+timedelta(hours=16)) 
                        req.OpenedToPending =c.total_seconds()/60
                        req.PendingToSolved =0
                        session.add(req)
                    elif req.Status_Name=="Pending" :
                        p = datetime.strptime(currentTime, datetimeFormat)- (datetime.strptime(str(req.FirstResponseAt), datetimeFormat)+timedelta(hours=16))
                        req.PendingToSolved =p.total_seconds()/60
                        session.add(req)

1 Ответ

1 голос
/ 06 февраля 2020

Трюк с магией c как таковой отсутствует - но кто-то еще об этом уже подумал, и есть модуль businesstimedelta, который делает то, что вы хотите, чтобы он делал:

import datetime
import businesstimedelta

workday = businesstimedelta.WorkDayRule(start_time=datetime.time(8),
                                        end_time=datetime.time(16),
                                        working_days=[0,1,2,3,6])

businesshours = businesstimedelta.Rules([workday])


d1 = datetime.datetime(2020,2,3,14,0,0)
d2 = datetime.datetime(2020,2,4,10,0,0)

d3 = datetime.datetime(2020,2,6,14,0,0)
d4 = datetime.datetime(2020,2,9,10,0,0)


print(businesshours.difference(d1,d2))
print(businesshours.difference(d3,d4))

Это определяет рабочая неделя, так что рабочие часы 8-16, а пятница и суббота объявлены выходными. Затем он делает некоторые расчеты. d1 - понедельник, d2 вторник, d3 четверг и d4 воскресенье.

Вы можете настроить рабочие дни, когда у вас sh, 0 будет понедельник и 6 воскресенье.

...