比较datetime时,代码在一段时间后挂起

比较datetime时,代码在一段时间后挂起,datetime,python-2.7,Datetime,Python 2.7,我有下面的代码,它在比较datetime时在一段时间后挂起。下面是我的代码 def worker(): flag = True while True: s1 = '101:35:00' e1 = '101:36:00' s2 = '101:37:00' e2 = '101:38:00' s3 = '101:39:00' e3 = '101:40:00' if int(s1[0]) == 1: start1 = str(da

我有下面的代码,它在比较datetime时在一段时间后挂起。下面是我的代码

def worker():
flag = True
while True:
    s1 = '101:35:00'
    e1 = '101:36:00'
    s2 = '101:37:00'
    e2 = '101:38:00'
    s3 = '101:39:00'
    e3 = '101:40:00'

    if int(s1[0]) == 1:
        start1 = str(datetime.datetime.now().date()) + ' ' + s1[1:9]
    else:
        start1 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s1[1:9]

    if int(s2[0]) == 1:
        start2 = str(datetime.datetime.now().date()) + ' ' + s2[1:9]
    else:
        start2 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s2[1:9]

    if int(s3[0]) == 1:
        start3 = str(datetime.datetime.now().date()) + ' ' + s3[1:9]
    else:
        start3 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s3[1:9]

    if int(e1[0]) == 1:
        end1 = str(datetime.datetime.now().date()) + ' ' + e1[1:9]
    else:
        end1 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e1[1:9]

    if int(e2[0]) == 1:
        end2 = str(datetime.datetime.now().date()) + ' ' + e2[1:9]
    else:
        end2 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e2[1:9]

    if int(e3[0]) == 1:
        end3 = str(datetime.datetime.now().date()) + ' ' + e3[1:9]
    else:
        end3 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e3[1:9]

    s1t = datetime.datetime.strptime(start1, '%Y-%m-%d %H:%M:%S')
    s2t = datetime.datetime.strptime(start2, '%Y-%m-%d %H:%M:%S')
    s3t = datetime.datetime.strptime(start3, '%Y-%m-%d %H:%M:%S')
    e1t = datetime.datetime.strptime(end1, '%Y-%m-%d %H:%M:%S')
    e2t = datetime.datetime.strptime(end2, '%Y-%m-%d %H:%M:%S')
    e3t = datetime.datetime.strptime(end3, '%Y-%m-%d %H:%M:%S')

    cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S')

    if e1t < curr <= s2t or e2t < curr <= s3t:
        flag = False

    else: pass

    while not flag:
        print 'iwashereghgj'
        print str(curr) #line1
        if s2t <= curr < e2t or s3t <= curr < e3t:          
            q1.put(True)

            flag = True
        else:
            flag = True
def worker():
flag=True
尽管如此:
s1='101:35:00'
e1='101:36:00'
s2='101:37:00'
e2='101:38:00'
s3='101:39:00'
e3='101:40:00'
如果int(s1[0])==1:
start1=str(datetime.datetime.now().date())+“”+s1[1:9]
其他:
start1=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+s1[1:9]
如果int(s2[0])==1:
start2=str(datetime.datetime.now().date())+“”+s2[1:9]
其他:
start2=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+s2[1:9]
如果int(s3[0])==1:
start3=str(datetime.datetime.now().date())+“”+s3[1:9]
其他:
start3=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+s3[1:9]
如果int(e1[0])==1:
end1=str(datetime.datetime.now().date())+“”+e1[1:9]
其他:
end1=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+e1[1:9]
如果int(e2[0])==1:
end2=str(datetime.datetime.now().date())+“”+e2[1:9]
其他:
end2=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+e2[1:9]
如果int(e3[0])==1:
end3=str(datetime.datetime.now().date())+''+e3[1:9]
其他:
end3=str(datetime.datetime.now().date()+datetime.timedelta(days=1))+“”+e3[1:9]
s1t=datetime.datetime.StrTime(开始时间1,“%Y-%m-%d%H:%m:%S”)
s2t=datetime.datetime.StrTime(开始时间2,%Y-%m-%d%H:%m:%S')
s3t=datetime.datetime.StrTime(开始时间3,“%Y-%m-%d%H:%m:%S”)
e1t=datetime.datetime.StrTime(end1,“%Y-%m-%d%H:%m:%S”)
e2t=datetime.datetime.StrTime(end2,“%Y-%m-%d%H:%m:%S”)
e3t=datetime.datetime.strtime(end3,“%Y-%m-%d%H:%m:%S”)
cur=datetime.datetime.now().strftime(“%Y-%m-%d%H:%m:%S”)
curr=datetime.datetime.strtime(cur,“%Y-%m-%d%H:%m:%S”)

如果e1t
def process_time(timestring):
    today = datetime.date.today()
    tomorrow = today + datetime.timedelta(days=1)
    h, m, s = map(int, timestring[1:9].split(':'))
    time = datetime.time(hour=h, minute=m, second=s)
    if timestring[0] == '1':
        return datetime.datetime.combine(today, time)
    return datetime.datetime.combine(tomorrow, time)
现在很清楚函数实际在做什么,您可以直接跳到

s1t = process_time(s1) # and so on
而且感觉你可以缩短

cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S')

至于您的问题,是您没有更新循环中的
curr
,因此它仍然是您开始执行任务的时间。您需要不断检查当前时间

实施:

# process time strings once, outside loop
timeslots = [(s1t, e1t), ...]
while True:
##    starting = True
    while any(s <= datetime.datetime.now() < e for s, e in timeslots):
##        if starting:
##            print("Starting:", datetime.datetime.now())
##            starting = False
        q1.put(True) # do task in timeslots
    if all(datetime.datetime.now() >= e for s, e in timeslots):
##        print("All timeslots done:", datetime.datetime.now())
        break
# whatever happens afterwards
#在循环外处理时间字符串一次
时隙=[(s1t,e1t),…]
尽管如此:
##开始=真
而任何(s=e表示s,e表示时隙):
##打印(“所有时间段完成:”,datetime.datetime.now()
打破
#以后发生什么事

注意:以
##
开头的行用于演示,保留注释供“生产”使用

所有这些重复都使您的代码很难调试。从一些封装开始:

def process_time(timestring):
    today = datetime.date.today()
    tomorrow = today + datetime.timedelta(days=1)
    h, m, s = map(int, timestring[1:9].split(':'))
    time = datetime.time(hour=h, minute=m, second=s)
    if timestring[0] == '1':
        return datetime.datetime.combine(today, time)
    return datetime.datetime.combine(tomorrow, time)
现在很清楚函数实际在做什么,您可以直接跳到

s1t = process_time(s1) # and so on
而且感觉你可以缩短

cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S')

至于您的问题,是您没有更新循环中的
curr
,因此它仍然是您开始执行任务的时间。您需要不断检查当前时间

实施:

# process time strings once, outside loop
timeslots = [(s1t, e1t), ...]
while True:
##    starting = True
    while any(s <= datetime.datetime.now() < e for s, e in timeslots):
##        if starting:
##            print("Starting:", datetime.datetime.now())
##            starting = False
        q1.put(True) # do task in timeslots
    if all(datetime.datetime.now() >= e for s, e in timeslots):
##        print("All timeslots done:", datetime.datetime.now())
        break
# whatever happens afterwards
#在循环外处理时间字符串一次
时隙=[(s1t,e1t),…]
尽管如此:
##开始=真
而任何(s=e表示s,e表示时隙):
##打印(“所有时间段完成:”,datetime.datetime.now()
打破
#以后发生什么事

注意:以
##
开头的行用于演示,保留注释供“生产”使用

所有这些重复都使您的代码很难调试。从一些封装开始:

def process_time(timestring):
    today = datetime.date.today()
    tomorrow = today + datetime.timedelta(days=1)
    h, m, s = map(int, timestring[1:9].split(':'))
    time = datetime.time(hour=h, minute=m, second=s)
    if timestring[0] == '1':
        return datetime.datetime.combine(today, time)
    return datetime.datetime.combine(tomorrow, time)
现在很清楚函数实际在做什么,您可以直接跳到

s1t = process_time(s1) # and so on
而且感觉你可以缩短

cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S')

至于您的问题,是您没有更新循环中的
curr
,因此它仍然是您开始执行任务的时间。您需要不断检查当前时间

实施:

# process time strings once, outside loop
timeslots = [(s1t, e1t), ...]
while True:
##    starting = True
    while any(s <= datetime.datetime.now() < e for s, e in timeslots):
##        if starting:
##            print("Starting:", datetime.datetime.now())
##            starting = False
        q1.put(True) # do task in timeslots
    if all(datetime.datetime.now() >= e for s, e in timeslots):
##        print("All timeslots done:", datetime.datetime.now())
        break
# whatever happens afterwards
#在循环外处理时间字符串一次
时隙=[(s1t,e1t),…]
尽管如此:
##开始=真
而任何(s=e表示s,e表示时隙):
##打印(“所有时间段完成:”,datetime.datetime.now()
打破
#以后发生什么事

注意:以
##
开头的行用于演示,保留注释供“生产”使用

所有这些重复都使您的代码很难调试。从一些封装开始:

def process_time(timestring):
    today = datetime.date.today()
    tomorrow = today + datetime.timedelta(days=1)
    h, m, s = map(int, timestring[1:9].split(':'))
    time = datetime.time(hour=h, minute=m, second=s)
    if timestring[0] == '1':
        return datetime.datetime.combine(today, time)
    return datetime.datetime.combine(tomorrow, time)
现在很清楚函数实际在做什么,您可以直接跳到

s1t = process_time(s1) # and so on
而且感觉你可以缩短

cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S')

至于您的问题,是您没有更新循环中的
curr
,因此它仍然是您开始执行任务的时间。您需要不断检查当前时间

实施:

# process time strings once, outside loop
timeslots = [(s1t, e1t), ...]
while True:
##    starting = True
    while any(s <= datetime.datetime.now() < e for s, e in timeslots):
##        if starting:
##            print("Starting:", datetime.datetime.now())
##            starting = False
        q1.put(True) # do task in timeslots
    if all(datetime.datetime.now() >= e for s, e in timeslots):
##        print("All timeslots done:", datetime.datetime.now())
        break
# whatever happens afterwards
#在循环外处理时间字符串一次
时隙=[(s1t,e1t),…]
尽管如此:
##开始=真
而任何(s=e表示s,e表示时隙):
##打印(“所有时间段完成:”,datetime.datetime.now()
打破
#以后发生什么事

注意:以
##
开头的行用于演示,保留注释供“生产”使用

请修复您的缩进如果为True,则您有
循环,没有
中断/返回/提升
,那么您希望它如何摆脱循环?但我的问题是为什么代码在2分钟后挂在第1行?请修复您的缩进如果为True,则您有
循环,而没有
中断/返回/提升
,那么,您希望它如何跳出循环?但我的问题是,为什么代码在2分钟后挂起在第1行?请修复您的缩进。您有
,而True
循环没有
中断/返回/提升
,那么您希望它如何跳出循环