如何在python中验证时间

2024-09-30 12:19:58 发布

您现在位置: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

Tags: selfdatetimetimerequeststatusoutpostfk
2条回答

通过编写具有明确定义用途的函数,您可以为自己(以及阅读您的代码的任何人,包括您未来的自己)提供帮助

例如:

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

你在做那些不该做的字符串操作,这让我很恼火。您应该直接使用时间对象。我知道@Grismar已经为你提供了一种直接与《泰晤士报》合作的方式。尽管如此,我还是花了一些时间自己整理一些东西,作为另一个例子。我想这有点简单,而且还需要测试。无论如何

import datetime

# Define a short alias for "datetime.time"
t = datetime.time

# Our status values
TIME_NONE = "TIME NONE"
BREAK_OUT = "BREAK OUT"
TIME_IN = "TIME IN"
TIME_OUT = "TIME OUT"

# Function that lets us represent AM and PM times in a more readable fashion below
def AM(hours):
    return hours

def PM(hours):
    return hours + 12

# Get the status for the specified time
def get_status(user_time):
    if user_time >= t(AM(10)) and user_time <= t(AM(10), 15) \
            or user_time >= t(PM(3)) and user_time <= t(PM(3), 15) \
            or user_time >= t(AM(12)) and user_time <= t(PM(1), 15):
        status = BREAK_OUT
    elif user_time >= t(AM(5)) and user_time <= t(PM(4)):
        status = TIME_IN
    elif user_time >= t(PM(5)) and user_time <= t(PM(11)):
        status = TIME_OUT
    else:
        status = TIME_NONE
    return status

# Convert a time to a human readable string
def time_to_string(t):
    return t.strftime('%I:%M %p')

# Test that one time meets our expectation in terms of its status
def test(t, expect_status):
    status = get_status(t)
    print(time_to_string(t) + " = " + status + ": ", end = "")
    if status == expect_status:
        print("yes")
    else:
        print("NO!!!!!!!")

def run_tests():
    # Run a test for each time period
    test(t(AM(10), 8), BREAK_OUT)
    test(t(AM(12), 35), BREAK_OUT)
    test(t(PM(3)), BREAK_OUT)
    test(t(AM(6), 30), TIME_IN)
    test(t(PM(9), 45), TIME_OUT)
    test(t(PM(11), 45), TIME_NONE)

run_tests()

相关问题 更多 >

    热门问题