Dick Moores said unto the world upon 2004-12-07 07:04:To Liam and Brian,
<SNIP>
Here's Brian's script in it's bare bones, without the input error checking and his extensive and helpful comments:
===============begin code====================
import datetime
import time
alarm_time = raw_input("Enter alarm time as hh:mm ")
alarm_time_list = alarm_time.split(':')
alarm_hour, alarm_minute = (int(alarm_time_list[0]),
int(alarm_time_list[1]))
now = datetime.datetime.now()
alarm_datetime = datetime.datetime(now.year+4, now.month, now.day,
alarm_hour, alarm_minute)
print alarm_datetime
alarm_in_seconds = (alarm_datetime - now).seconds
print "I should wake up in %d seconds" % alarm_in_seconds
time.sleep(alarm_in_seconds)
print "I'm awake!"
================end code=====================
<SNIP>
Brian, where did you learn about the ".seconds". And the .year, .month, .day of
"alarm_datetime = datetime.datetime(now.year + 4, now.month, now.day,
alarm_hour, alarm_minute)"?
Does this come from a general knowledge of OOP, or is it somewhere in the Python docs? The only thing I've seen, and it's not an explanation, is in note (1) on http://docs.python.org/lib/datetime-date.html
Oh Sir, you flatter me! My general knowledge of OOP is about the same as my general knowledge of the migration patterns of Siberian water-fowl. ;-)
After Anna, Gonçalo, and Liam encouraged me to explore the datetime module, I read (OK, skimmed) the docs. For my original purpose, I just needed to test two times with '>', but I recalled something about timedelta objects being returned by subtracting one datetime from another. I hadn't used them before I wrote my script in reply to you. I learned about the handy for your purposes .seconds attribute in the Library Reference -- 6.10.2 timedelta Objects. (That's the section name in the 2.4 installed docs; I'm typing off line so can't [OK, won't] get a link.)
It seems I've missed out on something important
BTW I'm not sure you need the +4 of "now.year + 4". I've run this without the +4 and it doesn't seem to be needed. And notes (1) and (4) on that page seem to say this, as far as I understand them.
I'm not sure I do either :-)
Here's why I did it:
I discovered that in order to get the right "seconds until alarm" value from the datetime for now and the alarm datetime by subtracting one datetime object from another, I needed the alarm datetime to be in the future. But, since you can set an alarm for 09:00 tomorrow at 22:00 today, I needed the alarm datetime to not use today's date. (If you use today's, you end up with seconds *since* 09:00 this morning, not the desired seconds *until* 09:00 tomorrow morning.) Since timedelta_object.seconds discards all difference save the seconds save those from the hours, minutes, and seconds difference in the two datetime objects, it doesn't matter what date the alarm datetime is set to. (The day information is in timedelta_object.days.)
Or, so I thought. I'd first tried getting the alarm datetime by simply taking the date component of datetime.datetime.now() and adding to the day value. That works fine, provided you are not on the last day of the month. But, when checking boundary cases before posting the code I sent, I discovered this sort of thing:
>>> last_day_of_june = datetime.datetime(2004, 6, 30) # long for clarity >>> ldj = last_day_of_june # short for typing >>> new_day = datetime.datetime(ldj.year, ldj.month, ldj.day + 1)
Traceback (most recent call last): File "<pyshell#8>", line 1, in -toplevel- new_day = datetime.datetime(ldj.year, ldj.month, ldj.day + 1) ValueError: day is out of range for month >>>
So, adding to the day or the month was out, unless I wanted elaborate code to determine which to add to under what circumstances. So then I thought, "Well, just change from now.day + 1 to now.year + 1, and all problems go away". And then I thought "Ah, but what if I try to run the script on Feb. 29?
So, that's why I used now.year + 4. It still leaves open the possibility of getting bit by the every so often further correction to the calender, but, I *believe* the next one is due in 2100, so I think I can live with it. ;-)
I'm not saying it isn't hackish, though. Better ways surely exist.
Brian,
I just can't succeed in reproducing the problems with the boundary cases with the +4 removed. I've tried setting my computer's clock to Nov 30, Feb 29, 2004, and Dec 31, 2004 (without changing the time). It's now about 9 am where I am, and setting the alarm time to 0700 (i.e., on the next day) works fine in all 3 cases. And of course no problem at today's date with setting the alarm time to 07:00.
Isn't that what that note (1) on <http://docs.python.org/lib/datetime-date.html> implies?
I did the testing with <http://www.rcblue.com/Python/timer4-ForWeb.py>, by remarking out the time.sleep() line and noting what the print_hms(sleepSeconds) function prints.
Dick
_______________________________________________ Tutor maillist - [EMAIL PROTECTED] http://mail.python.org/mailman/listinfo/tutor