首页 > 解决方案 > 如何在python中验证时间

问题描述

我正在创建一个简单的计时,但我的逻辑很难,if the user log between 10:00 AM to 10:15 AM or 12:00 PM or 3:00 PM to 3:15 PM状态将是BREAK OUT它的工作状态,当用户登录时05:00PM to 11:00PM,状态将是TIME OUT,但是当用户在5:00AM to 4:00PM状态之间登录时仍然处于TIME OUT假设状态成为一个TIME IN

这是我的代码:

def set_time(fk):
                status = 'TIME IN'

                print('RESULT: ' + datetime.strptime(self.request.POST['time'], '%I:%M:%S %p').strftime('%I:%M %p'))
                print('set')

                user_time = datetime.strptime(self.request.POST['time'], '%I:%M:%S %p').strftime('%I:%M %p')

                if (user_time >= datetime.strptime('10:00 AM', '%I:%M %p').strftime('%I:%M %p') \
                and user_time <= datetime.strptime('10:15 AM', '%I:%M %p').strftime('%I:%M %p')) \
                or user_time >= datetime.strptime('12:00 PM', '%I:%M %p').strftime('%I:%M %p') \
                or (user_time >= datetime.strptime('03:00 PM', '%I:%M %p').strftime('%I:%M %p') \
                and user_time <= datetime.strptime('03:15 PM', '%I:%M %p').strftime('%I:%M %p')):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'BREAK OUT')
                    status = 'BREAK OUT'

                elif user_time >= datetime.strptime('05:00 AM', '%I:%M %p').strftime('%I:%M %p') \
                and user_time <= datetime.strptime('04:00 PM', '%I:%M %p').strftime('%I:%M %p'):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'TIME IN')
                    status = 'TIME IN'

                elif user_time >= datetime.strptime('05:00 PM', '%I:%M %p').strftime('%I:%M %p') \
                and user_time <= datetime.strptime('11:00 PM', '%I:%M %p').strftime('%I:%M %p'):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'TIME OUT')
                    status = 'TIME OUT'
                
                return status

我更新到这个:

def set_time(fk):
                status = 'TIME IN'

                datemask = '%I:%M %p'
                
                print('RESULT: ' + datetime.strptime(self.request.POST['time'], '%I:%M:%S %p').strftime(datemask))
                print('set')

                user_time = datetime.now().strftime(datemask)
                print('USER TIME: ' + str(user_time))

                if (user_time >= datetime.strptime('10:00 AM', datemask).strftime(datemask) \
                and user_time <= datetime.strptime('10:15 AM', datemask).strftime(datemask)):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'BREAK OUT')
                    status = 'BREAK OUT'
                
                elif user_time >= datetime.strptime('12:00 PM', datemask).strftime(datemask) and \
                user_time <= datetime.strptime('12:59 PM', datemask).strftime(datemask):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'BREAK OUT')
                    status = 'BREAK OUT'

                elif user_time >= datetime.strptime('03:00 PM', datemask).strftime(datemask) \
                and user_time <= datetime.strptime('03:15 PM', datemask).strftime(datemask):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'BREAK OUT')
                    status = 'BREAK OUT'

                elif user_time >= datetime.strptime('05:00 AM', datemask).strftime(datemask) \
                and user_time <= datetime.strptime('04:00 PM', datemask).strftime(datemask):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'TIME IN')
                    status = 'TIME IN'

                elif user_time >= datetime.strptime('05:00 PM', datemask).strftime(datemask) \
                and user_time <= datetime.strptime('11:00 PM', datemask).strftime(datemask):
                    TimeLogsModel.objects.create(date = fk,
                    time = self.request.POST['time'],
                    status = 'TIME OUT')
                    status = 'TIME OUT'
                
                return status

标签: python

解决方案


通过编写具有明确定义的目的的函数,您会为自己(以及任何阅读您的代码的人,包括您未来的自己)帮个忙。

例如:

def get_status(self, user_time, start, end, breaks):
    if not (start <= user_time <= end):
        return 'time out'
    else:
        for start_break, end_break in breaks:
            if start_break <= user_time <= end_break:
                return 'break out'
        return 'time in'

如果我正确理解您的逻辑,这会给出正确的状态,有时给出,例如:

my_object.get_status(time(12, 10), 
                     time(5, 0), time(17, 0), 
                     [(time(10, 0), time(10, 15)), 
                      (time(12, 0), time(13, 00)), 
                      (time(15, 0), time(15, 15))])

(为了清楚起见换行)

这将返回'break out'。然后,您可以从另一个方法中使用此方法,该方法对通过某些 Web 表单返回的值执行某些操作 - 将处理表单的代码与测试某些业务规则的代码分开(即一段时间内的状态是什么) )。

由于您似乎不需要工作日的开始和结束时间是可变的,也不需要休息时间,您可能希望将其移至构造函数:

from datetime import time


class MyClass:
    def __init__(self, start, end, breaks):
        self.start = start
        self.end = end
        self.breaks = breaks

    def get_status(self, user_time):
        if not (self.start <= user_time <= self.end):
            return 'time out'
        else:
            for start_break, end_break in self.breaks:
                if start_break <= user_time <= end_break:
                    return 'break out'
        return 'time in'


obj = MyClass(time(5, 0), time(17, 0),
              [(time(10, 0), time(10, 15)),
               (time(12, 0), time(13, 00)),
               (time(15, 0), time(15, 15))])

print(obj.get_status(time(12, 10)))

结果:

break out

在你的情况下可能是这样的:

from datetime import datetime, time


class MyClass:
    def __init__(self, start, end, breaks):
        self.start = start
        self.end = end
        self.breaks = breaks

        # you probable have some code that sets this to a valid request
        self.request = None

    def get_status(self, user_time):
        if not (self.start <= user_time <= self.end):
            return 'time out'
        else:
            for start_break, end_break in self.breaks:
                if start_break <= user_time <= end_break:
                    return 'break out'
        return 'time in'

    def set_time(self, fk):
        user_time = datetime.strptime(self.request.POST['time'], '%I:%M:%S %p').time()
        status = self.get_status(user_time)
        # assuming this exists and works
        TimeLogsModel.objects.create(date=fk,
                                     time=self.request.POST['time'],
                                     status=status)
        # just returning the status because you did, not sure you even want that
        return status

推荐阅读