classification
Title: datetime/date strftime() method and time.strftime() inconsistency
Type: behavior Stage:
Components: Library (Lib) Versions: Python 2.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: gregory.p.smith, mishok13, sbj3, shura_zam
Priority: normal Keywords:

Created on 2008-05-07 14:45 by mishok13, last changed 2008-06-02 04:11 by gregory.p.smith. This issue is now closed.

Messages (3)
msg66360 - (view) Author: Andrii V. Mishkovskyi (mishok13) Date: 2008-05-07 14:45
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:
1. Add an explicit note about this behavior (e.g., "only 'str' objects
are allowed for format strings") in docs (section 5.1.7).
2. 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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
TypeError: strftime() argument 1 must be str, not unicode
msg67332 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2008-05-25 08:54
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(
msg67627 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2008-06-02 04:11
Fixed in trunk (2.6) r63887.
History
Date User Action Args
2008-06-02 04:11:59gregory.p.smithsetstatus: open -> closed
assignee: gregory.p.smith ->
resolution: fixed
messages: + msg67627
versions: - Python 2.6
2008-05-25 08:54:45gregory.p.smithsetpriority: normal
assignee: gregory.p.smith
messages: + msg67332
nosy: + gregory.p.smith
2008-05-10 05:03:24shura_zamsetnosy: + shura_zam
2008-05-09 18:11:02sbj3setnosy: + sbj3
2008-05-07 14:45:42mishok13create