python - 如何在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
推荐阅读
- python - 在 TF2.4.0 中使用 fit_generator 方法将来自生成器的多个输入用于模型
- css - 使用 CSS 径向渐变添加模糊
- google-bigquery - 大查询错误 - 标量子查询产生了多个结果
- google-sheets - 如何获取谷歌表格中最后一个非空日期的总计数?
- libreoffice - 印地语单词中的数字
- javascript - 如何从自定义下拉菜单中选择县、市和地区?
- amazon-web-services - 如何将 VPN 连接路由到 /30 CIDR?
- python-3.x - 如何在不获取“函数调用堆栈:修剪”的情况下为标记化字符串生成 ELMo 嵌入?
- typescript - 在带有打字稿的列表中的项目之间插入一些东西
- angular - 如何在 Angular 指令中添加 html 标签?