Mercurial > genshi > mirror
diff examples/trac/trac/util/datefmt.py @ 39:93b4dcbafd7b trunk
Copy Trac to main branch.
author | cmlenz |
---|---|
date | Mon, 03 Jul 2006 18:53:27 +0000 |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/examples/trac/trac/util/datefmt.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2003-2006 Edgewall Software +# Copyright (C) 2003-2004 Jonas Borgström <jonas@edgewall.com> +# Copyright (C) 2006 Matthew Good <trac@matt-good.net> +# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://trac.edgewall.com/license.html. +# +# This software consists of voluntary contributions made by many +# individuals. For exact contribution history, see the revision +# history and logs, available at http://projects.edgewall.com/trac/. +# +# Author: Jonas Borgström <jonas@edgewall.com> +# Matthew Good <trac@matt-good.net> + +import locale +import sys +import time + +# Date/time utilities + +def pretty_timedelta(time1, time2=None, resolution=None): + """Calculate time delta (inaccurately, only for decorative purposes ;-) for + prettyprinting. If time1 is None, the current time is used.""" + if not time1: time1 = time.time() + if not time2: time2 = time.time() + if time1 > time2: + time2, time1 = time1, time2 + units = ((3600 * 24 * 365, 'year', 'years'), + (3600 * 24 * 30, 'month', 'months'), + (3600 * 24 * 7, 'week', 'weeks'), + (3600 * 24, 'day', 'days'), + (3600, 'hour', 'hours'), + (60, 'minute', 'minutes')) + age_s = int(time2 - time1) + if resolution and age_s < resolution: + return '' + if age_s < 60: + return '%i second%s' % (age_s, age_s != 1 and 's' or '') + for u, unit, unit_plural in units: + r = float(age_s) / float(u) + if r >= 0.9: + r = int(round(r)) + return '%d %s' % (r, r == 1 and unit or unit_plural) + return '' + +def format_datetime(t=None, format='%x %X', gmt=False): + if t is None: + t = time.time() + if not isinstance(t, (list, tuple, time.struct_time)): + if gmt: + t = time.gmtime(int(t)) + else: + t = time.localtime(int(t)) + + text = time.strftime(format, t) + encoding = locale.getpreferredencoding() + if sys.platform != 'win32': + encoding = locale.getlocale(locale.LC_TIME)[1] or encoding + # the above is broken on win32, e.g. we'd get '437' instead of 'cp437' + return unicode(text, encoding, 'replace') + +def format_date(t=None, format='%x', gmt=False): + return format_datetime(t, format, gmt) + +def format_time(t=None, format='%X', gmt=False): + return format_datetime(t, format, gmt) + +def get_date_format_hint(): + t = time.localtime(0) + t = (1999, 10, 29, t[3], t[4], t[5], t[6], t[7], t[8]) + tmpl = format_date(t) + return tmpl.replace('1999', 'YYYY', 1).replace('99', 'YY', 1) \ + .replace('10', 'MM', 1).replace('29', 'DD', 1) + +def get_datetime_format_hint(): + t = time.localtime(0) + t = (1999, 10, 29, 23, 59, 58, t[6], t[7], t[8]) + tmpl = format_datetime(t) + return tmpl.replace('1999', 'YYYY', 1).replace('99', 'YY', 1) \ + .replace('10', 'MM', 1).replace('29', 'DD', 1) \ + .replace('23', 'hh', 1).replace('59', 'mm', 1) \ + .replace('58', 'ss', 1) + +def http_date(t=None): + """Format t as a rfc822 timestamp""" + if t is None: + t = time.time() + if not isinstance(t, (list, tuple, time.struct_time)): + t = time.gmtime(int(t)) + weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec'] + return '%s, %02d %s %04d %02d:%02d:%02d GMT' % ( + weekdays[t.tm_wday], t.tm_mday, months[t.tm_mon - 1], t.tm_year, + t.tm_hour, t.tm_min, t.tm_sec) + +def parse_date(text): + seconds = None + text = text.strip() + for format in ['%x %X', '%x, %X', '%X %x', '%X, %x', '%x', '%c', + '%b %d, %Y']: + try: + date = time.strptime(text, format) + seconds = time.mktime(date) + break + except ValueError: + continue + if seconds == None: + raise ValueError, '%s is not a known date format.' % text + return seconds