def timesince(d=None, now=None, abbreviate=False, separator=','):
 if abbreviate:
  chunks = (((((60 * 60) * 24) * 365), (lambda n: 'y')), ((((60 * 60) * 24) * 30), (lambda n: 'm')), ((((60 * 60) * 24) * 7), (lambda n: 'w')), (((60 * 60) * 24), (lambda n: 'd')), ((60 * 60), (lambda n: 'h')), (60, (lambda n: 'm')), (1, (lambda n: 's')))
 else:
  chunks = (((((60 * 60) * 24) * 365), (lambda n: ungettext('year', 'years', n))), ((((60 * 60) * 24) * 30), (lambda n: ungettext('month', 'months', n))), ((((60 * 60) * 24) * 7), (lambda n: ungettext('week', 'weeks', n))), (((60 * 60) * 24), (lambda n: ungettext('day', 'days', n))), ((60 * 60), (lambda n: ungettext('hour', 'hours', n))), (60, (lambda n: ungettext('minute', 'minutes', n))), (1, (lambda n: ungettext('second', 'seconds', n))))
 if (not isinstance(d, datetime.datetime)):
  d = datetime.datetime(d.year, d.month, d.day)
 if (now and (not isinstance(now, datetime.datetime))):
  now = datetime.datetime(now.year, now.month, now.day)
 if (not now):
  if d.tzinfo:
   now = datetime.datetime.now(LocalTimezone(d))
  else:
   now = datetime.datetime.now()
 delta = (now - (d - datetime.timedelta(0, 0, d.microsecond)))
 since = ((((delta.days * 24) * 60) * 60) + delta.seconds)
 if (since <= 0):
  if abbreviate:
   return (u'0' + ugettext('s'))
  else:
   return (u'0 ' + ugettext('seconds'))
 for (i, (seconds, name)) in enumerate(chunks):
  count = (since // seconds)
  if (count != 0):
   break
 if abbreviate:
  s = (ugettext('%(number)d%(type)s') % {'number': count, 'type': name(count)})
 else:
  s = (ugettext('%(number)d %(type)s') % {'number': count, 'type': name(count)})
 if ((i + 1) < len(chunks)):
  (seconds2, name2) = chunks[(i + 1)]
  count2 = ((since - (seconds * count)) // seconds2)
  if (count2 != 0):
   if abbreviate:
    s += (ugettext('%(separator)s %(number)d%(type)s') % {'separator': separator, 'number': count2, 'type': name2(count2)})
   else:
    s += (ugettext('%(separator)s %(number)d %(type)s') % {'separator': separator, 'number': count2, 'type': name2(count2)})
 return s

def timesince ( d = None , now = None , abbreviate = False , separator = ',' ) : if abbreviate : chunks = ( ( ( ( ( 60 * 60 ) * 24 ) * 365 ) , ( lambda n : 'y' ) ) , ( ( ( ( 60 * 60 ) * 24 ) * 30 ) , ( lambda n : 'm' ) ) , ( ( ( ( 60 * 60 ) * 24 ) * 7 ) , ( lambda n : 'w' ) ) , ( ( ( 60 * 60 ) * 24 ) , ( lambda n : 'd' ) ) , ( ( 60 * 60 ) , ( lambda n : 'h' ) ) , ( 60 , ( lambda n : 'm' ) ) , ( 1 , ( lambda n : 's' ) ) ) else : chunks = ( ( ( ( ( 60 * 60 ) * 24 ) * 365 ) , ( lambda n : ungettext ( 'year' , 'years' , n ) ) ) , ( ( ( ( 60 * 60 ) * 24 ) * 30 ) , ( lambda n : ungettext ( 'month' , 'months' , n ) ) ) , ( ( ( ( 60 * 60 ) * 24 ) * 7 ) , ( lambda n : ungettext ( 'week' , 'weeks' , n ) ) ) , ( ( ( 60 * 60 ) * 24 ) , ( lambda n : ungettext ( 'day' , 'days' , n ) ) ) , ( ( 60 * 60 ) , ( lambda n : ungettext ( 'hour' , 'hours' , n ) ) ) , ( 60 , ( lambda n : ungettext ( 'minute' , 'minutes' , n ) ) ) , ( 1 , ( lambda n : ungettext ( 'second' , 'seconds' , n ) ) ) ) if ( not isinstance ( d , datetime . datetime ) ) : d = datetime . datetime ( d . year , d . month , d . day ) if ( now and ( not isinstance ( now , datetime . datetime ) ) ) : now = datetime . datetime ( now . year , now . month , now . day ) if ( not now ) : if d . tzinfo : now = datetime . datetime . now ( LocalTimezone ( d ) ) else : now = datetime . datetime . now ( ) delta = ( now - ( d - datetime . timedelta ( 0 , 0 , d . microsecond ) ) ) since = ( ( ( ( delta . days * 24 ) * 60 ) * 60 ) + delta . seconds ) if ( since <= 0 ) : if abbreviate : return ( u'0' + ugettext ( 's' ) ) else : return ( u'0 ' + ugettext ( 'seconds' ) ) for ( i , ( seconds , name ) ) in enumerate ( chunks ) : count = ( since // seconds ) if ( count != 0 ) : break if abbreviate : s = ( ugettext ( '%(number)d%(type)s' ) % { 'number' : count , 'type' : name ( count ) } ) else : s = ( ugettext ( '%(number)d %(type)s' ) % { 'number' : count , 'type' : name ( count ) } ) if ( ( i + 1 ) < len ( chunks ) ) : ( seconds2 , name2 ) = chunks [ ( i + 1 ) ] count2 = ( ( since - ( seconds * count ) ) // seconds2 ) if ( count2 != 0 ) : if abbreviate : s += ( ugettext ( '%(separator)s %(number)d%(type)s' ) % { 'separator' : separator , 'number' : count2 , 'type' : name2 ( count2 ) } ) else : s += ( ugettext ( '%(separator)s %(number)d %(type)s' ) % { 'separator' : separator , 'number' : count2 , 'type' : name2 ( count2 ) } ) return s
formats a date as the time since that date .