diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | date.py | 52 |
2 files changed, 34 insertions, 22 deletions
@@ -1,6 +1,10 @@ ChangeLog for logilab.common ============================ + -- + * fix logilab.common.date.ustrftime() for python3 (closes #82161, + patch by Arfrever Frehtes Taifersar Arahesis) + 2012-07-30 -- 0.58.2 * modutils: fixes (closes #100757 and #100935) @@ -1,4 +1,4 @@ -# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of logilab-common. @@ -22,6 +22,7 @@ __docformat__ = "restructuredtext en" import math import re +import sys from locale import getpreferredencoding from datetime import date, time, datetime, timedelta from time import strptime as time_strptime @@ -279,29 +280,36 @@ def last_day(somedate): def ustrftime(somedate, fmt='%Y-%m-%d'): """like strftime, but returns a unicode string instead of an encoded - string which' may be problematic with localized date. + string which may be problematic with localized date. - encoding is guessed by locale.getpreferredencoding() + When using Python 2, encoding is guessed by locale.getpreferredencoding(). """ - encoding = getpreferredencoding(do_setlocale=False) or 'UTF-8' - try: - return unicode(somedate.strftime(str(fmt)), encoding) - except ValueError, exc: - if somedate.year >= 1900: - raise - # datetime is not happy with dates before 1900 - # we try to work around this, assuming a simple - # format string - fields = {'Y': somedate.year, - 'm': somedate.month, - 'd': somedate.day, - } - if isinstance(somedate, datetime): - fields.update({'H': somedate.hour, - 'M': somedate.minute, - 'S': somedate.second}) - fmt = re.sub('%([YmdHMS])', r'%(\1)02d', fmt) - return unicode(fmt) % fields + if sys.version_info >= (3, 3): + # datetime.date.strftime() supports dates since year 1 in Python >=3.3. + return somedate.strftime(fmt) + else: + try: + if sys.version_info < (3, 0): + encoding = getpreferredencoding(do_setlocale=False) or 'UTF-8' + return unicode(somedate.strftime(str(fmt)), encoding) + else: + return somedate.strftime(fmt) + except ValueError, exc: + if somedate.year >= 1900: + raise + # datetime is not happy with dates before 1900 + # we try to work around this, assuming a simple + # format string + fields = {'Y': somedate.year, + 'm': somedate.month, + 'd': somedate.day, + } + if isinstance(somedate, datetime): + fields.update({'H': somedate.hour, + 'M': somedate.minute, + 'S': somedate.second}) + fmt = re.sub('%([YmdHMS])', r'%(\1)02d', fmt) + return unicode(fmt) % fields def utcdatetime(dt): if dt.tzinfo is None: |