在一周的不同时间打印

时间:2010-12-03 12:32:22

标签: python datetime

Welp,就Python而言,我是一个菜鸟。毫无疑问。做过一些VBS和VB所以我有点了解。

我使用Python做的任务似乎很简单:只在这些时间运行一个动作:

Mon: between 1:30 am and 7:30 am
Tues – Fri: between 3:00 am 7:30 am
Sat: between 1:00 am and 9:00 am and 5:00 pm to Midnight
Sun: Midnight to 8:30 am

麻烦的是,我能想到的就是这个(我甚至不确定这是否正常工作):

import time

def IsOffHour(time):
    if (time.tm_wday > 4):
        return True
    elif (time.tm_hour >= 17):
        return True
    elif (time.tm_hour < 8):
        return True
    else:
        return False

now = time.localtime()
if IsOffHour(now):
    print 'hello cruel world !'

我不确定如何处理从:30开始的时间。这有点难以测试,也许我可以更改系统日期和角钱来测试它。

似乎我很接近,对想法持开放态度。

谢谢!

3 个答案:

答案 0 :(得分:2)

您应该尝试time模块,而不是使用datetime模块。这样的任务要容易得多。

如果您使用虚构日期(或替换支票中的日期),您可以这样做:

>>> x = datetime.datetime(1, 1, 1, 13, 37, 40)
>>> a = datetime.datetime(1, 1, 1, 1, 30, 0)
>>> b = datetime.datetime(1, 1, 1, 7, 30, 0)
>>> a < x < b
False

>>> x = datetime.datetime(1, 1, 1, 5, 0, 0)
>>> a < x < b
True

答案 1 :(得分:0)

我的想法:

  1. 分别检查每一天(if time_wday == ...if time_wday in [...]
  2. 检查时间将它们转换为基于24小时的字符串(有strftime()),然后比较为字符串,因此time.tm_hour >= ..代替hrstr > '13:30' and hrstr < '19:30'
  3. 这给出了如下代码:

    def IsOffHour(dt):
        hrstr = '%02d:%02d' % (dt.tm_hour, dt.tm_min)
        if dt.tm_wday == 0:
            return '01:30' <= hrstr <= '07:30'
        if dt.tm_wday in [1, 2, 3, 4]:
            return '03:00' <= hrstr <= '07:30'
        if dt.tm_wday == 5:
            return '01:00' <= hrstr <= '09:00' or hrstr >= '17:00'
        if dt.tm_wday == 6:
            return hrstr <= '08:30'
        return False
    

答案 2 :(得分:0)

您应该做的是将time个对象与time个对象进行比较,而不是提取小时和分钟并手动执行此操作。

因此,使用time对象在脚本中定义可接受的时间窗口,然后查看当前时间是否落在任何窗口中。

from datetime import datetime,time

# Set our allowed time windows in a dictionay indexed by day, with 0 =
# Monday, 1 = Tuesday etc.  Each value is list of tuples, the tuple
# containing the start and end time of each window in that day
off_windows = {
    0: [(time(1,30),time(7,30))],
    1: [(time(3,0),time(7,30))],
    2: [(time(3,0),time(7,30))],
    3: [(time(3,0),time(7,30))],
    4: [(time(3,0),time(7,30))], 
    5: [(time(1,0),time(9,0)),(time(16,0),time.max)],  #time.max is just before midnight
    6: [(time(0,0),time(8,30))]
}


def is_off_hours():
    # Get current datetime
    current = datetime.now()

    # get day of week and time
    current_time = current.time()
    current_day = current.weekday()

    # see if the time falls in any of the windows for today
    return any(start <= current_time <= end for (start,end) in off_windows[current_day])

if is_off_hours():
    print 'Hello cruel world!'

上面我们使用any function,如果iterable的任何值为True,则返回True。所以他编码循环通过我们定义了一天的关闭窗口,如果当前时间属于任何一个,则返回true。

关于python这个很好,我们可以说:

start <= current_time <= end 

而不是

start <= current_time and current_time <= end