#16906: Avoid strftime when isoformat can do the job
-------------------------------------+-------------------------------------
     Reporter:  aaugustin            |                    Owner:  nobody
         Type:                       |                   Status:  new
  Cleanup/optimization               |                Component:  Core
    Milestone:                       |  (Other)
      Version:  1.3                  |                 Severity:  Normal
     Keywords:                       |             Triage Stage:
    Has patch:  0                    |  Unreviewed
  Needs tests:  0                    |      Needs documentation:  0
Easy pickings:  0                    |  Patch needs improvement:  0
                                     |                    UI/UX:  0
-------------------------------------+-------------------------------------
 r7946 introduced a `datetime_safe` module that provides a Python
 implementation of `datetime.[date|datetime].strftime` for dates before
 1900.

 However, this is overkill for the purpose of just showing a `date` or
 `datetime` in ISO format (`%Y-%m-%d` and `%Y-%m-%d %H:%M:%S`). It makes
 the code needlessly complicated, sometimes inconistent, and inefficient.
 The `isoformat` method achieves the same result, works for any date, and
 is implemented in C.

 Also, some code still uses the `strftime` function from the standard
 library. Using `isoformat` is better because it isn't subject to the 1900
 limit.

 See attached patch.

 ----

 For more background, see `isoformat_date` in
 
http://svn.python.org/view/python/tags/r271/Modules/datetimemodule.c?view=markup.
 Note that `date` objects have no `__unicode__` and their `__str__` just
 call `isoformat`, so `str(date)` or `unicode(date)` is the same as
 `datetime_safe.date(date.year, date.month,
 date.day).strftime('%Y-%m-%d')`. It's pretty much the same for `datetime`
 objects, except that `isoformat` uses `T` as a separator, while `str` and
 `unicode` use a space.

 Changing `date.format('%Y-%m-%d')` to `date.isoformat()` is safe. Changing
 `datetime.format('%Y-%m-%d %H:%M:%S')` to `datetime.isoformat()` requires
 removing the microseconds and the timezone first, if there is one, so the
 correct pattern is `datetime.replace(microsecond=0, tzinfo=None)`. This
 also applies for time objects.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/16906>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to