如何在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

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

例如:

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()

最新更新