[Tutor] Re: Could I have used time or datetime modules here?

Dick Moores rdm at rcblue.com
Tue Dec 7 18:04:46 CET 2004


Brian van den Broek wrote at 07:50 12/7/2004:
>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 



More information about the Tutor mailing list