22

I have the following code in one of my models:

def shortDescription(self):
    return self.name + ' ' + self.class_date.strftime("%I:%M")

self.class_date is a timezone aware DateTimeField, self.class_date.is_aware() is True, USE_TZ is True.

The shortDescription returns a string that gives the time in UTC rather than the default timezone, putting {{ aclass.class_date }} in the template displays the time in the correct zone.

Is strftime always working on the base, native time? Or what else is going on here?

Daniel Holmes
  • 1,952
  • 2
  • 17
  • 28
Rob Osborne
  • 4,897
  • 4
  • 32
  • 43

1 Answers1

52

When you directly reference pieces of the datetime like %I or %M, it uses it straight as it is with no locale conversion. If you included %Z you'd see that the time is in UTC. If you want locale-aware results, you need use the more limited %X, which will simply spit out the full time converted for the locale.

If you need more, you'll have to convert it:

from django.utils import timezone

def shortDescription(self):
    class_date = timezone.localtime(self.class_date)
    return self.name + ' ' + class_date.strftime("%I:%M")

Or, you can rely on the date filter, which automatically does this for you:

from django.template import defaultfilters

def shortDescription(self):
    return self.name + ' ' + defaultfilters.date(self.class_date, 'g:i')
Chris Pratt
  • 232,153
  • 36
  • 385
  • 444