[Tutor] Working with dates
Liam Clarke
cyresse at gmail.com
Sun Oct 17 04:11:33 CEST 2004
Kia ora all,
I am trying to write a function that will get today's date when run,
and set a string to the date of a day in the previous week.
i.e. it's Saturday the 16th of October, and I want to find the date of
Friday last week.
I want to generate a date string that is valid for the IMAP4 protocol,
so it must be in format
16-Oct-2004.
It will be run once a week, usually on a Monday, usually looking for
the last Friday. I want it to be able to handle Friday being in a
different month or year and still give a precise date.
This is what I've done so far, but I'm sure there's a more efficient
way to do it, so feedback is gratefully received.
A little note on day_offset -
gmtime() returns a integer representing the day of the week, Monday to
Sunday is 0 to 6.
So, I set up a wee index spanning two weeks like so: -
M T W T F S S M T W T F S S
-7 -6 -5 -4 -3 -2 -1 ( 0 1 2 3 4 5 6)
The numbers in brackets are returned by calendar.weekday, the negative
ones are my constructs.
import time
import datetime
day_offset=-3 #Friday of previous week, will be changable by user in config
gm_data=time.gmtime() #Get today's date/time
(year, month, day, weekday)=gm_data[0], gm_data[1], gm_data[2],
gm_data[6] #Only need first 3 values and 7th, which is weekday.
date_offset = -(day_offset-weekday)
# This is to work with datetime.timedelta,which works with positive days.
# so it works out to date_offset = - ( -3 - 5) = 8
last_friday=datetime.date(year, month, day) -
datetime.timedelta(days=date_offset)
#Create date object for today's date, to use Python's built handling
of date arithmetic.
#timedelta is difference, so last_friday = today's date - 8 days
retrieve_date_string=str(last_friday)
#last_friday is an object, I need a string so that I can reformat the date
(last_friday outputs as 2004-10-08)
split_date=retrieve_date_string.split('-')
email_sent_date=time.strftime("%d-%b-%Y", (int(split_date[0]),
int(split_date[1]), int(split_date[2]), 0, 0, 0, 0, 0, 0))
(time.strftime looks for a tuple of (year, month, day, hour, minute,
second, weekday, day of year, and something called tm_isdst) I can't
pass it my last_friday object, so I have to generate a tuple for last
Friday. gmtime() generates the 9 value tuple normally.)
And email_sent_date = "8-Oct-2004"
Am I using redundant code anywhere? I just found a redundancy in that
I was using gmtime() to get my year month and day, but was using
calendar.weekday to get my week day value, when gmtime() generates it
anyway.
I can see a problem here, if this is run on the Saturday or Sunday, it
won't get the Friday just been, but the Friday previously. So, I may
just add a catcher for if weekday >= 5
Thank-you for your time
Liam Clarke
More information about the Tutor
mailing list