This is a port of the Django timesince function to web2py. To use it, put it in a model, controller or module. Or anywhere so that web2py sees it.
import datetime, time
def timesince(d, now=None):
"""
Takes two datetime objects and returns the time between d and now
as a nicely formatted string, e.g. "10 minutes". If d occurs after now,
then "0 minutes" is returned.
Units used are years, months, weeks, days, hours, and minutes.
Seconds and microseconds are ignored.
Up to two adjacent units will be displayed.
For example,
"2 weeks" is legal
"1 year, 3 months" is legal
but "1 year, 2 weeks" is NOT legal
because "years" and "weeks" are NOT adjacent..... "months" has been skipped
Adapted from http://blog.natbat.co.uk/archive/2003/Jun/14/time_since
"""
chunks = (
(60 * 60 * 24 * 365, lambda n: T('one year') if n==1 else T('%(n)d years',dict(n=n))),
(60 * 60 * 24 * 30, lambda n: T('one month') if n==1 else T('%(n)d months',dict(n=n))),
(60 * 60 * 24 * 7, lambda n: T('one week') if n==1 else T('%(n)d weeks',dict(n=n))),
(60 * 60 * 24, lambda n: T('one day') if n==1 else T('%(n)d days',dict(n=n))),
(60 * 60, lambda n: T('one hour') if n==1 else T('%(n)d years',dict(n=n))),
(60, lambda n: T('one minute') if n==1 else T('%(n)d minutes',dict(n=n))),
)
if not now:
t = time.localtime()
now = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5])
# ignore microsecond part of 'd' since we removed it from 'now'
delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
since = delta.days * 24 * 60 * 60 + delta.seconds
if since <= 0: return T('zero minutes')
for seconds, name in chunks:
count = since // seconds
if count != 0: break
return name(count)