开发者

Printing during different times of week

Welp, I'm a noob when it comes to Python. No doubt about it. Have done some VBS and VB so I have a bit of understanding.

What I am taske开发者_如何学God to do using Python seems easy: run an action only during these times:

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

Trouble is, all I've been able to come up with is this (and I'm not even sure this is working properly):

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 !'

I'm not sure how to handle the times that start at :30. It's been a bit hard to test, maybe I can change the system date and dime to test it out.

It seems like I'm close, open to ideas.

Thanks!


Instead of using the time module you should try the datetime module. It's much easier for tasks like these.

If you use a fictional date (or replace the date in your checks) than you can do it like this:

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


My ideas:

  1. do check for each day separately (if time_wday == ... or if time_wday in [...])
  2. for checking hours convert them to 24h based string (there is strftime()) and then compare as strings, so instead of time.tm_hour >= .. this will look as hrstr > '13:30' and hrstr < '19:30'

this gives code like:

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


What you should be doing is comparing time objects to time objects rather than extracting the hours and minutes and doing this by hand.

So define the acceptable time windows in your script using time objects and then just see if the current time falls in any of the those windows.

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!'

Above we use the any function which returns True if any value of an iterable is True. So he code loops through the off windows which we have defined for a day, returning true if the current time falls within any of them.

A nice this about python is we can say:

start <= current_time <= end 

instead of

start <= current_time and current_time <= end 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜