3

我在日历中使用以下代码来告诉我需要多长时间才能参加活动。有两个部分,一个显示工作开始前的时间,另一个显示我需要多久醒来工作。

work_alarm = timedelta(hours=2, minutes=30)
a_n = int((we_dt - tct).total_seconds() / 60) # to get minutes remaining from the current time to when work starts
alarm_time = we_dt - work_alarm
up_time = int((alarm_time - tct).total_seconds() / 60) # total minutes until I need to be up
print "Scheduled Work Time: " + str(we_dt.strftime('%H:%M'))
print "You have " + str(we[1]) + " in " + str(int((((we_dt - tct).total_seconds() / 60) / 60))) + " hours and " + str(divmod(a_n, 60)[1]) + " minutes."
print "You need to be up in " + str(int((((alarm_time - tct).total_seconds() / 60) / 60))) + " hours and " + str(divmod(up_time, 60)[1]) + " minutes."

这一切都很好,直到“你需要起床”的时间过去了。事件时间过去后,它会停止报告它,所以这不是一个真正的问题,但我想设置一个 if 语句,可以检查或判断你需要的时间是否已经过去并停止显示它。因为就目前而言,在这段时间过去之后,它的数量只会开始向相反的方向上升。例如:如果距离我需要起床还有 1 分钟,那么在它达到零后,它就会开始上升:之后的 1、2、3 分钟等。该数字不显示为负整数,因此我不确定如何对此进行比较,以便在时间过去后停止显示。需要注意的是,这个脚本每分钟都会使用一个 apscheduler 模块运行。任何帮助,将不胜感激。

4

2 回答 2

2

如果值为负数,您只需要一个if不显示任何内容的语句。

您说“数字不显示为负整数”,但您没有显示数字。您正在显示str(divmod(up_time, 60))[1]. 所以,如果up_time是 -3,它会显示在57……但up_time它本身仍然是一个负数。

work_alarm = timedelta(hours=2, minutes=30)
a_n = int((we_dt - tct).total_seconds() / 60) # to get minutes remaining from the current time to when work starts
alarm_time = we_dt - work_alarm
up_time = int((alarm_time - tct).total_seconds() / 60) # total minutes until I need to be up
if up_time >= 0:
    print "Scheduled Work Time: " + str(we_dt.strftime('%H:%M'))
    print "You have " + str(we[1]) + " in " + str(int((((we_dt - tct).total_seconds() / 60) / 60))) + " hours and " + str(divmod(a_n, 60)[1]) + " minutes."
    print "You need to be up in " + str(int((((alarm_time - tct).total_seconds() / 60) / 60))) + " hours and " + str(divmod(up_time, 60)[1]) + " minutes."

或者,更好的是,告诉调度程序在工作时间过去时不要调用您的代码。如果没有看到您的调度程序代码,很难说如何做到这一点 - 可能会在else此处调整到明天早上的时间表,或者可能首先构建一个更复杂的时间表,或者......</p>

于 2013-09-25T19:45:44.733 回答
0

您可以使用函数返回两个日期时间之间的小时、分钟(和秒):

def time_between(a, b):
    minutes, seconds = divmod((b-a).total_seconds(), 60)
    hours, minutes = divmod(minutes, 60)
    return hours, minutes, seconds

使用此功能,您的大部分计算都可以与打印的代码分开。再加上使用更具描述性的变量名,将使您的代码更易于理解:

import datetime as DT

def time_between(a, b):
    minutes, seconds = divmod((b-a).total_seconds(), 60)
    hours, minutes = divmod(minutes, 60)
    return hours, minutes, seconds

# current time
tct = DT.datetime.now()
# job datetime (just for example)
we_dt = tct + DT.timedelta(hours=3, minutes=30)

work_alarm = DT.timedelta(hours=2, minutes=30)

# time till work
work_hours, work_minutes, work_seconds = time_between(tct, we_dt)

# time till get up
up_time = we_dt - work_alarm
up_hours, up_minutes, up_seconds = time_between(tct, up_time)
print("""\
Scheduled Work Time: {wt}
You have {we} in {h} + hours and {m} minutes.""".format(
          wt=we_dt.strftime('%H:%M'),
          we='something to do',
          h=work_hours,
          m=work_minutes))

if up_time > tct:
    print('You need to be up in {uh}  hours and {um} minutes.'.format(
        uh=up_hours,
        um=up_minutes))
于 2013-09-25T20:02:19.180 回答