Issue 2782: datetime/date strftime() method and time.strftime() inconsistency (original) (raw)
datetime and date strftime() method does additional check on input format, thus being completely different from time's module time.strftime() method behavior. There are two ways to fix this:
- Add an explicit note about this behavior (e.g., "only 'str' objects are allowed for format strings") in docs (section 5.1.7).
- Allow 'unicode' objects for format strings (backport time.strftime() from 3.0?).
Here is a traceback for a more complete overview:
Python 2.6a2+ (trunk:62762, May 6 2008, 14:37:27) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
from datetime import datetime, date import time uformat = u'%Y-%m-%D %H-%M-%S' format = '%Y-%m-%D %H-%M-%S' datetime.today().strftime(uformat) Traceback (most recent call last): File "", line 1, in TypeError: strftime() argument 1 must be str, not unicode datetime.today().strftime(format) '2008-05-05/07/08 17-19-03' time.strftime(uformat) '2008-05-05/07/08 17-19-10' time.strftime(format) '2008-05-05/07/08 17-19-16' date.today() datetime.date(2008, 5, 7) date.today().strftime(format) '2008-05-05/07/08 00-00-00' date.today().strftime(uformat) Traceback (most recent call last): File "", line 1, in TypeError: strftime() argument 1 must be str, not unicode
Yes, sounds like a bug. I'll fix it.
But should time.strftime allow a unicode format string as input in the first place? For backwards compatibility I'd say yes. But.. Sane output can not be guaranteed from time.strftime when given a unicode format string if it contains multibyte characters that happen to have a valid (bytewise) % format code in them within a multibyte character. Anyways the output is always byte string without a specified encoding so giving it actual unicode characters as input is not advised (at least in 2.6, i didn't check 3.0).
there's an amusing comment in Modules/datetimemodule.c:
/* I sure don't want to reproduce the strftime code from the time module,
- so this imports the module and calls it. All the hair is due to
- giving special meanings to the %z, %Z and %f format codes via a
- preprocessing step on the format string. ... */ static PyObject * wrap_strftime(