The "beaty" of date arithmetic

Hans-Joachim Widmaier hjwidmaier at
Thu Jan 23 08:52:01 CET 2003

Hello, my knowledgeable and helpful pythonistas! (A little flattery
can't hurt :))

I have a small program sitting in my FvwmButtons that allows me to
connect and disconnect to the Internet. It shows me the accumulated
time and volume as well as  a xload-like graph for the transfer speed.
But this is just to give some context, so you can deduce what I'm
after even if my explanation in this not-my-mother-language ain't good

Here goes: The accounting is done by months starting at a given day.
Now I want to write a summary line in my log file (for the previous
month) whenever a new accounting month starts. So I wrote a function
that returns me the first and last day of a month interval which
contains a certain time ("previous" thus means "month with any online
time at all"). This would be easy if there wasn't the possibility for
"first day" being 1 -- the day before that isn't just "n-1".

Now here's (finally) my solution:
def getDateInterval(ttime, fday):
    """Return a month-interval starting at day |fday| and including
    start = list(time.localtime(ttime))
    # Calculate first day
    if start[2] < fday:
	# Must be last month
	start[1] -= 1
	if start[1] < 1:
	    start[1]  = 12
	    start[0] -= 1
    # The last day is the day before next month's first day
    start[8] = -1		# set DST to unknown
    start[2] = fday
    end = start[:]
    end[1] += 1
    if end[1] > 12:
	end[1]  = 1
	end[0] += 1
    end = time.localtime(time.mktime(end) - 86400)

    return start[:3], end[:3]

All I'm asking for is: Is there a way to do it that's not as butt-ugly
as this?
Somehow it looks pathetic to me ...

Thanks for any thoughts,

More information about the Python-list mailing list